PostgreSQL中实现自增的三种方式举例
作者:天真的柏拉图
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_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1; ALTER SEQUENCE public.t_user_user_id_seq OWNER TO postgres;
表删除后序列随之删除 该实现方式下表和序列是关联关系 DROP TABLE t_user
1.2 序列 (SEQUENCE)
通过定义序列的方式实现自增字段 需要在创建表之前先定义一个序列
示例
先定义序列
CREATE SEQUENCE IF NOT EXISTS public.t_user_user_id_seq INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 NO 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) )
删除表时序列会随之一起删除
附:修改已有表主键为自增
已有表结构
CREATE TABLE student ( id int4 PRIMARY KEY, name VARCHAR );
创建序列:代码中的1表示此主键从1开始,注意:如果项目中的表已经有数据,那么START 后边的数字一定要比数据库中的主键字段的最大值要大或者相同
CREATE SEQUENCE student_id_seq START 1;
修改主键默认值
ALTER TABLE student ALTER COLUMN id SET DEFAULT nextval('student_id_seq'::regclass);
总结
到此这篇关于PostgreSQL中实现自增的三种方式的文章就介绍到这了,更多相关PostgreSQL实现自增方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!