PostgreSQL具有数据类型smallserial,serial和bigserial; 这些不是真正的类型,而只是在创建唯一标识符列的标志以方便使用。 我们之前创建省份和学生 是自己填写 ID的
INSERT INTO public.province( "ID", "Name") VALUES (6, '上海');
Code language: PHP (php)
这些类似于一些其他数据库支持的AUTO_INCREMENT属性。 如果您希望某列具有唯一的约束或是主键,则必须搭配主键约束进行指定。 类型名称serial用于创建整数列。 类型名称bigserial创建一个bigint类型的列。 如果您期望在表的使用期限内使用超过2^31个标识符,则应使用bigserial。 类型名称smallserial创建一个smallint列。
说白了 也就是如果我们希望 某个字段是自增长 则使用这些带serial后缀的类型。这一点和其他的sql关系型数据库不同。
比如我们创建一张公司表 希望它的ID是自增长。
CREATE TABLE COMPANY(
ID SERIAL PRIMARY KEY,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Code language: PHP (php)

插入的时候,不需要指明ID的值。ID会自动生成。
INSERT INTO public."COMPANY"(
"Name")
VALUES ('百度');
Code language: PHP (php)
接着 我们往这张表 插入多条数据。 注意:我们并没有指明ID的值。它是自动生成的。
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ( 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ('Allen', 25, 'Texas', 15000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ( 'Teddy', 23, 'Norway', 20000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ( 'Mark', 25, 'Rich-Mond ', 65000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ( 'David', 27, 'Texas', 85000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ( 'Kim', 22, 'South-Hall', 45000.00 );
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY) VALUES ( 'James', 24, 'Houston', 10000.00 );
Code language: JavaScript (javascript)
- serial / bigserial / smallserial 本质只是语法糖,底层会自动创建序列(sequence)。
- 插入数据时,不指定自增字段,数据库自动分配ID。
- 手动指定ID插入,不会同步更新序列,后续自增可能出现主键冲突。
- 新版本PostgreSQL推荐使用
GENERATED AS IDENTITY,相比serial更加规范。