在 PostgreSQL 中创建自动增长字段

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表示步长数,就是序号每次生成自增几,如果不指定这个参数,默认值是1start表示序号从几开始。下面举几个例子:

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');
create auto increment field in postgresql

其它创建递增序号的方式

如果想创建从 1 开始每次递增 1的序号,可以使用如下简化方式,这个方式不需要使用序号生成器:

CREATE TABLE "public"."App" (
"Id" integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"AppName" varchar(64) NOT NULL CHECK ("AppName" <> '')
);
Tags: postgresql