- 答案:
-
SELECT setval('自增序列名',MAX(自增主键)+1,true) FROM 表名;
- 查询全部序列:
select * from pg_class where relowner=(select usesysid from pg_user where usename='postgres') and relkind='S'
- 创建序列
CREATE SEQUENCE t_app_app_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 99999999999
START 1
CACHE 10;
ALTER TABLE t_app_app_id_seq
OWNER TO postgres;
- 问题描述:
- 当前t_app表最大id为99
- SELECT nextval('t_app_app_id_seq'::regclass)为100
- 手动插入一条id为100的数据。(如果在MySQL中,此时表t_app的序列已自动调整为100,下一个序列值为101。)
- PostgreSQL中 SELECT nextval('t_app_app_id_seq'::regclass)仍为100
问题定位:
自增序列没有判断下一个序列值是否小于表内最大ID。
解决思路:
- 设置当前序列值为表中最大值
- SQL:
true:下一个序列值为设置值+1,false:下一个序列值为当前设置值。SELECT setval('t_app_app_id_seq',MAX(自增主键),true) FROM 表名;
- 即手动设置当前序列值(参考解决思路1、2步)
或在Insert或Update触发器中实现上一步的判断。(触发器请百度实现,不建议使用触发器。手动调整序列值即可,一般情况也没人去篡改数据导致自增序列异常)