web-dev-qa-db-ja.com

psql:id SERIAL PRIMARY KEYが1で始まっていませんか?

これは私にはわからないことですが、誰かが説明できますか?

テーブルを作成します

CREATE TABLE cali (id SERIAL PRIMARY KEY,
    ALK_from char,
    ALK_to char,
    AND_from char,
    AND_to char);

次に、単純にcsvファイルからいくつかのデータを挿入しようとします

\COPY cali FROM '/home/.../data/output/id_cali.csv' (FORMAT CSV);

これは私にこのエラーを与えます:

ERROR:  value "4372840000" is out of range for type integer
CONTEXT:  COPY cali, line 1, column id: "4372840000"

私は4372840000が整数オーバーフローを引き起こすことを知っています。そのため、最初に値を文字として挿入しようとしています。

しかし、私の理解はid SERIAL PRIMARY KEYある種の自動インクリメントです。列idに値4372840000が使用されるのはなぜですか?

ファイルは次のようになります

4372840012,4372840013,13,14,
4372840014,4372840014,15,15,
1
LarsVegas

テーブルは

create table cali (
    id serial primary key,
    alk_from bigint,
    alk_to bigint,
    and_from int,
    and_to int
);

そして、やります

\COPY cali (alk_from, alk_to, and_from, and_to) 
FROM '/home/.../data/output/id_cali.csv' 
(FORMAT CSV);

そのため、idシリアル列に挿入しないことがわかります。シリアル型は真の型ではありません。 マニュアルから

Smallserial、serial、bigserialのデータ型は真の型ではなく、一意の識別子列を作成するための表記上の便宜にすぎません(他のいくつかのデータベースでサポートされているAUTO_INCREMENTプロパティと同様)。

したがって、整数列を作成し、そのデフォルト値がシーケンスジェネレーターから割り当てられるように調整しました

6
Clodoaldo

同じステートメントでテーブルを作成できますが、その後、次のステートメントを実行します-基本的に、id列のデータ型を変更します。

alter table cali alter column id type bigint;

0
smishra