psql:id SERIAL PRIMARY KEY 不是以 1 开头?

Lar*_*gas 1 postgresql bulkcopy serialization

这是我不明白的地方,有人可以解释一下吗?

我创建一个表

CREATE TABLE cali (id SERIAL PRIMARY KEY,
    ALK_from char,
    ALK_to char,
    AND_from char,
    AND_to char);
Run Code Online (Sandbox Code Playgroud)

然后我只是尝试像这样从 csv 文件中插入一些数据

\COPY cali FROM '/home/.../data/output/id_cali.csv' (FORMAT CSV);
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

ERROR:  value "4372840000" is out of range for type integer
CONTEXT:  COPY cali, line 1, column id: "4372840000"
Run Code Online (Sandbox Code Playgroud)

我知道 4372840000 会导致整数溢出。这就是为什么我首先尝试将值作为字符插入。

但我的理解是,这id SERIAL PRIMARY KEY是某种自动增量,为什么值 4372840000 用于列id

该文件看起来像这样

4372840012,4372840013,13,14,
4372840014,4372840014,15,15,
Run Code Online (Sandbox Code Playgroud)

Clo*_*ldo 6

表应该是

create table cali (
    id serial primary key,
    alk_from bigint,
    alk_to bigint,
    and_from int,
    and_to int
);
Run Code Online (Sandbox Code Playgroud)

并且做

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

这样它就知道不要插入到 id 序列列中。串行类型不是真正的类型。从手册

数据类型 smallserial、serial 和 bigserial 不是真正的类型,而仅仅是创建唯一标识符列的符号方便(类似于某些其他数据库支持的 AUTO_INCREMENT 属性)

因此,我们创建了一个整数列并安排它的默认值从序列生成器中分配