一文全面了解PostgreSQL的序列(sequence)
- 关于序列:Sequence
- 常用命令
- 创建序列:2种方法
- 删除序列
- 定义表: 3种方法
- 插入数据
- 获取序列下一个值
- 获取当前的序列值
- 重新设置序列的开始值
- 错误:duplicate key value violates unique constraint
- 错误日志
- 解决方法
关于序列:Sequence
- 自动增加的数字序列,一般可作为表ID字段的标识,类似MySQL中字段AUTO_INCREMENT属性
- 官方资料
- https://www.postgresql.org/docs/9.6/functions-sequence.html
常用命令
创建序列:2种方法
- 方法一:最简单(全默认)
CREATE SEQUENCE oldgeek_test_seq;
- 方法二:指定序列的开始和最大值
CREATE SEQUENCE oldgeek_test_seq
INCREMENT BY 1
MAXVALUE 99999999
START WITH 1
NO CYCLE;
删除序列
代码语言:javascript复制drop sequence oldgeek_test_seq;
定义表: 3种方法
方法一:定义表时不指定序列
代码语言:javascript复制CREATE TABLE oldgeek_test (
id integer NOT NULL,
user_name varchar(20),
PRIMARY KEY(id)
);
方法二:定义表时自动生成序列
- SERIAL等同于MySQL的AUTO_INCREMENT属性
CREATE TABLE oldgeek_test(
id SERIAL NOT NULL,
user_name varchar(20),
PRIMARY KEY(id)
);
方法三:定义表时指定使用序列
代码语言:javascript复制CREATE SEQUENCE oldgeek_test_seq
INCREMENT BY 1
MAXVALUE 99999999
START WITH 1
NO CYCLE;
CREATE TABLE oldgeek_test (
id integer DEFAULT nextval('oldgeek_test_seq') NOT NULL,
user_name varchar(20),
PRIMARY KEY(id)
);
插入数据
插入值:对应表定义的:方法一
代码语言:javascript复制INSERT INTO oldgeek_test VALUES (nextval('oldgeek_test_seq'), 'oldgeek');
插入值:对应表定义的:方法二 Or 方法三
代码语言:javascript复制INSERT INTO oldgeek_test(user_name) VALUES ('oldgeek');
查看插入后数据
代码语言:javascript复制SELECT * FROM oldgeek_test;
获取序列下一个值
- 自定义序列ID(定义表的方法一 Or 方法三)
select nextval('oldgeek_test_seq');
- 使用SERIAL定义序列(定义表的方法二)
- 序列的命名规则:表名 后缀【_id_seq】
select nextval('oldgeek_test_id_seq');
获取当前的序列值
代码语言:javascript复制select currval('oldgeek_test_seq');
重新设置序列的开始值
代码语言:javascript复制select setval('oldgeek_test_seq', 1);
select nextval('oldgeek_test_seq');
错误:duplicate key value violates unique constraint
错误日志
代码语言:javascript复制Unique violation: 7 ERROR: duplicate key value violates unique constraint "oldgeek_test_pkey"↵DETAIL: Key (id)=(33) already exists.
解决方法
确认记录数
代码语言:javascript复制select MAX(id) FROM oldgeek_test
获取下一个序列数:对比下记录数和序列数
代码语言:javascript复制select nextval('oldgeek_test_seq');
重新设置序列数:获取最大ID,然后重新设置序列ID
代码语言:javascript复制select setval('oldgeek_test_seq', (select max(id) from oldgeek_test));
查看下一个序列数
代码语言:javascript复制select nextval('oldgeek_test_seq');