我有一个在下面的代码中创建的表:
CREATE TABLE "salesorderdetail" (
"salesorderid" SERIAL NOT NULL ,
"salesorderdetailid" SERIAL PRIMARY KEY,
"orderqty" int NOT NULL,
"productid" int NOT NULL,
"unitprice" float NOT NULL,
"unitpricediscount" float NOT NULL,
"linetotal" float NOT NULL
) WITH (
OIDS=FALSE
);
此外,我将从csv文件导入的记录添加到表中。我想在表中插入一条新记录,我不断收到此错误
错误:重复键值违反了唯一约束 “salesorderdetail_pkey”详情:Key(salesorderdetailid)=(2)已经 存在。 **********错误**********
错误:重复键值违反了唯一约束 “salesorderdetail_pkey”SQL状态:23505详细信息:密钥 (salesorderdetailid)=(2)已经存在。
我尝试通过执行以下查询来更改表的顺序。
SELECT MAX("salesorderdetailid") FROM "salesorderdetail"; --Output is 75123
CREATE SEQUENCE user_id_seq;
ALTER SEQUENCE user_id_seq RESTART WITH 75124; --Hence I manually enter 75124
然后我再次尝试了插入查询:
INSERT INTO "salesorderdetail" (orderqty,productid,unitprice,unitpricediscount,linetotal) values (1,1,8.00,0,8.00);
我仍然收到此错误!我还注意到,每次我尝试执行插入查询时,重复键值会自动增加3,4,5,6等。
答案 0 :(得分:2)
(首先,对于没有评论而是回答道歉 - 我还没有足够的评论来评论)
这是一个有趣的问题。我在我自己的PostGres沙箱实例上执行了所有代码,并且在模式中插入任何新数据都没有问题。
我注意到这个代码块存在问题
SELECT MAX("salesorderdetailid") FROM "salesorderdetail"; --Output is 75123
CREATE SEQUENCE user_id_seq;
ALTER SEQUENCE user_id_seq RESTART WITH 75124; --Hence I manually enter 75124
在我自己的实例中,序列默认名称默认为 salesorderdetail_salesorderdetailid_seq 。除非你明确地改变它,否则我猜测你的CSV内容中的某些内容(似乎不太可能)或上面查询中序列的命名都是问题。有趣的是,当我尝试重新启动这个不存在的序列时,PG没有返回任何错误。
所以 - 试试这个
alter sequence salesorderdetail_salesorderdetailid_seq RESTART with 75124;