在 PostgreSQL 中创建自动增长字段
2022/10/09
PostgreSQL 中创建自动增长字段的方式主要是通过定义序号生成器SEQUENCE
来实现,具体来说就是分为两步:第一步定义序号生成器,第二步使用nextval(regclass)
函数作为字段的默认值。
一、定义序号生成器
CREATE SEQUENCE [ IF NOT EXISTS ] name
[ AS data_type ]
[ INCREMENT increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
可以看出,上面的语句中有很多是可选项,那么简化后的创建方式如下:
CREATE SEQUENCE name
[ AS data_type ]
[ INCREMENT increment ]
[ START start ]
其中,name
表示序号生成器的名称,建议使用小写字母加下划线的方式,不要使用大写字母。data_type
表示序号的类型,int
为 32 位整数,bigint
为 64 位整数。increment
表示步长数,就是序号每次生成自增几,如果不指定这个参数,默认值是1
。start
表示序号从几开始。下面举几个例子:
1、创建从 100001 开始的整数序号
DROP SEQUENCE IF EXISTS app_id_seq;
CREATE SEQUENCE app_id_seq AS bigint START 100001;
2、创建从 1 开始的奇数序号
DROP SEQUENCE IF EXISTS app_id_seq;
CREATE SEQUENCE app_id_seq AS bigint INCREMENT 2 START 1;
二、使用 nextval(regclass) 函数作为字段的默认值
上面第一步中已经创建了名为app_id_seq
的序号生成器,那么接下来就是要在创建字段的时候使用这个序号生成器,例如我想让字段Id
自动增长,那么就需要指定字段的默认值为nextval('app_id_seq')
。nextval(regclass)
函数的作用是按照指定的序号生成器生成下一个序号值,其中regclass
就是我们在第一步创建的序号生成器的名称,注意要用单引号括起来,举例如下:
CREATE TABLE "public"."App" (
"Id" bigint DEFAULT nextval('app_id_seq') NOT NULL,
"AppName" varchar(64) COLLATE "pg_catalog"."default" NOT NULL
);
三、测试效果
DROP SEQUENCE IF EXISTS app_id_seq;
CREATE SEQUENCE app_id_seq START 100001;
CREATE TABLE "public"."App" (
"Id" bigint DEFAULT nextval('app_id_seq') NOT NULL,
"AppName" varchar(64) COLLATE "pg_catalog"."default" NOT NULL
);
insert into "public"."App" ("AppName") values ('Google');
insert into "public"."App" ("AppName") values ('Microsoft');
其它创建递增序号的方式
如果想创建从 1 开始每次递增 1
的序号,可以使用如下简化方式,这个方式不需要使用序号生成器:
CREATE TABLE "public"."App" (
"Id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"AppName" varchar(64) NOT NULL CHECK ("AppName" <> '')
);