sql - 自动增量失败

标签 sql postgresql sql-insert

我有一个在下面的代码中创建的表:

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 文件导入到表中。我想向表中插入一条新记录,但不断收到此错误

ERROR: duplicate key value violates unique constraint "salesorderdetail_pkey" DETAIL: Key (salesorderdetailid)=(2) already exists. ********** Error **********

ERROR: duplicate key value violates unique constraint "salesorderdetail_pkey" SQL state: 23505 Detail: Key (salesorderdetailid)=(2) already exists.

我尝试通过执行以下查询来更改表的顺序。

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 等。

最佳答案

(首先,抱歉没有发表评论而是回答 - 我还没有足够的观点来发表评论)

这是一个有趣的问题。我在我自己的 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;

关于sql - 自动增量失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37951140/

相关文章:

database - 从旧硬盘传输 postgres 数据库

php - 如何在 Postgresql 中保存/读取 mPDF 生成的 pdf

python - pymysql insert insert_id 使用 phpmyadmin 返回 0

php - 错误 : UNIQUE constraint failed. ...但当我使用 SELECT * 语句 (SQLite) 时不会

sql - SSIS 隐藏工作表作为 Excel 目标

mysql - 对多行 SQL 求和

java - FreeMarker 中日期的默认值

sql - 将单个值插入到新创建的列中

sql - 限制数据库树的深度

php - 如果不存在,将条目添加到数据库的最快方法