PG中实现自增字段的三种方式:

  • 标识列 (IDENTITY)
  • 序列 (SEQUENCE)
  • Serial类型

自增字段主要用于实现自增主键或生成唯一版本号

1.1 标识列 (IDENTITY)

标识列是SQL标准推荐实现自增的方式

示例
CREATE TABLE t_user (user_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,user_name varchar(50) NOT NULL UNIQUE)INSERT INTO t_user (user_name) value ('tony')

说明:

  • 创建一个名为t_user的表 CREATE TABLE t_user ()

  • 字段user_id为integer类型 user_id integer

    定义为标识列且总是按照标识列生成(由系统生成) GENERATED ALWAYS AS IDENTITY

    定义为主键 PRIMARY KEY

  • 字段user_name为varchar类型

    约束其不为空且唯一 NOT NULL UNIQUE

  • 插入一条数据 INSERT INTO t_user (user_name) value (‘tony’)

    由于user_id是使用标识列实现的自增主键 由系统赋值 因此插入时只需指定user_name的值即可

原理

定义标识列之后系统后台会自动创建并维护一个名为tablename_column_seq的序列 基于此序列生成自增数据

-- SEQUENCE: public.t_user_user_id_seq-- DROP SEQUENCE IF EXISTS public.t_user_user_id_seq;CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seqINCREMENT 1START 1MINVALUE 1MAXVALUE 2147483647CACHE 1;ALTER SEQUENCE public.t_user_user_id_seqOWNER TO postgres;

表删除后序列随之删除 该实现方式下表和序列是关联关系 DROP TABLE t_user

1.2 序列 (SEQUENCE)

通过定义序列的方式实现自增字段 需要在创建表之前先定义一个序列

示例

先定义序列

CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seqINCREMENT 1START 1MINVALUE 1MAXVALUE 2147483647CACHE 1NO CYCLE

说明:

  • 创建一个名为表名_自增字段名_seq的序列 CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq
  • 参数:
    • INCREMENT 1:序列每次自增多少
    • START 1:从1开始
    • MINVALUE 1:序列的最小值
    • MAXVALUE 2147483647:序列的最大值
    • CACHE 1:缓存序列 但是服务器重启之后缓存会丢失
    • NO CYCLE / CYCLE:是否循环 序列增长到最大值之后是否从新开始 NO CYCLE表示不重新开始

再创建表

CREATE TABLE t_user (user_id integer DEFAULT nextval('t_user_user_id_seq') PRIMARY KEY ,user_name varchar(50) NOT NULL UNIQUE)

说明:

DEFAULT nextval('t_user_user_id_seq'):默认值为t_user_user_id_seq序列的下一个值

nextval(‘序列’)——获取序列的下一个值

currval(‘序列’)——获取序列的当前值

删除表时序列不会随之删除 仍会保留下来

删除语句:DROP SEQUENCE IF EXISTS public.t_user_user_id_seq;

1.3 Serial

示例
CREATE TABLE t_user (user_id serial PRIMARY KEY ,user_name varchar(50) NOT NULL UNIQUE)
原理

系统自动生成一个序列与表相关联

CREATE TABLE IF NOT EXISTS public.t_user(user_id integer NOT NULL DEFAULT nextval('t_user_user_id_seq'::regclass),user_name character varying(50) COLLATE pg_catalog."default" NOT NULL,CONSTRAINT t_user_pkey PRIMARY KEY (user_id),CONSTRAINT t_user_user_name_key UNIQUE (user_name))

删除表时序列会随之一起删除