我有一个这样创建的表:
--
-- Table: #__content
--
CREATE TABLE "jos_content" (
"id" serial NOT NULL,
"asset_id" bigint DEFAULT 0 NOT NULL,
...
"xreference" varchar(50) DEFAULT '' NOT NULL,
PRIMARY KEY ("id")
);
稍后插入一些指定 id 的行:
INSERT INTO "jos_content" VALUES (1,36,'About',...)
稍后插入一些没有 id 的记录,它们因错误而失败:
Error: duplicate key value violates unique constraint
。
显然 id 被定义为一个序列:
每个失败的插入都会增加序列中的指针,直到它增加到不再存在的值并且查询成功。
SELECT nextval('jos_content_id_seq'::regclass)
表定义有什么问题?解决这个问题的聪明方法是什么?
您的表定义没有任何问题。
(除了我会使用
jos_content_id
or 来代替非描述性的列名id
。而且我可能会使用
text
而不是varchar(50)
.你的
INSERT
说法是问题所在。将您的
id
列定义为serial
,您不应为 插入手动值id
。这些可能与相关序列中的下一个值发生冲突。提供一个明确的目标列列表(这对于持久化
INSERT
语句几乎总是一个好主意)并完全省略串行列。如果您需要立即自动生成的列的值,请使用
RETURNING
子句:有关 SO 的相关答案中的更多详细信息:
如果您在
serial
以后可能会发生冲突的列中有手动输入,请将您的序列设置为当前最大值id
以修复此问题一次:jos_content_id_seq
拥有的序列的默认名称在哪里jos_content.id
,您已经在默认列中找到了该名称。似乎是xhzt8_content_id_seq
你的情况;更新: SO上出现了类似的问题,我想出了一个新的解决方案: