在我的 postgresql 9.2 数据库中,我创建了下表:
CREATE TABLE dummy(id SERIAL PRIMARY KEY,text TEXT);
我通过以下方式插入了一条记录:
INSERT INTO dummy(text) VALUES ("Hello Word");
然后我插入了这样的记录:
INSERT INTO dummy(id,text) VALUES (2,'SAYONARA Word');
之后,当我尝试插入这样的记录时:
INSERT INTO dummy(text) VALUES ('<3 Word');
我收到以下错误:
错误:重复键值违反唯一约束“dummy_pkey”详细信息:键 (id)=(2) 已存在。
但是当我重新插入值时:
INSERT INTO dummy(text) VALUES ('<3 Word');
没有错误被抛出。
因此,当我看到 potgresql 通过内部计数器自动增加 id 的值时,无论该值是否成功插入。也发生了错误,因为 postgresql 没有在现有的计数器 id 上“打孔”。
那么我如何告诉 postgresql 是否存在自动增量值只是为了跳到下一个并避免使用现有的自动增量值。(现有的我的意思是已经设置为主键的值)。
您可以使用以下语句将序列与 ID 列的当前最大值同步:
在线示例:https ://rextester.com/GMK2630
在插入具有显式提供的值的行后,您可以手动运行此操作。
请注意,如果这是从多个事务同时完成的,这仍然会导致错误的序列值,因为一个事务看不到其他事务插入(但未提交)的值。
但我强烈建议让默认值完成其工作,像这样调整顺序更像是一种技巧,而不是良好的编码习惯。