当前位置: 首页 > 知识库问答 >
问题:

自动递增失败

阚正真
2023-03-14

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

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"DETAIL: Key(SalesorderDetid)=(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等。

共有1个答案

管杜吟
2023-03-14

(首先,我为没有发表评论而道歉,我没有足够的观点发表评论)

这是一个有趣的问题。我在我自己的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\u salesorderdetailid\u seq。除非您明确地更改它,否则我猜您的CSV内容中的某些内容(似乎不太可能)或上面查询中序列的命名都是问题所在。有趣的是,当我尝试重新启动这个不存在的序列时,PG没有返回任何错误。

所以-试试这个

alter sequence salesorderdetail_salesorderdetailid_seq RESTART with 75124;
 类似资料:
  • 问题内容: 我的架构看起来像这样: 我已经在同一数据库中创建了counters集合,并添加了一个带有’entityId’的_id的页面。从这里我不确定如何使用猫鼬来更新该页面并获取递增编号。 没有计数器的架构,我希望它保持这种状态,因为这实际上不是应用程序使用的实体。仅应在模式中使用它来自动递增字段。 问题答案: 这是一个示例,如何在Mongoose中实现自动增量字段:

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为。(如果使用包装器) 在某些情况下,该策略被解析为或,因此你可能需要手动将其设置为(取决于基础数据库)。 似乎+ 指定序列名称对你有用。

  • 问题内容: 使用MySQL(特别是5.0)有没有办法让auto_increment字段的值基于分组列? 例: 我不想通过任何“疯狂”的方法来达到这个目的,但是如果需要的话。 问题答案: 对于MyISAM和BDB表,您可以将auto_increment字段作为键的次要部分,例如 这是手册对此所说的 在这种情况下,将为AUTO_INCREMENT列生成的值计算为MAX(auto_increment_c

  • 问题内容: 我现在正在一家公司中使用全球DBA的无限智慧,他创建了一个表,该表将一个int用作ID字段,但是不会自动递增该数字。 我要从.Net传递一个表值参数,因为它随时有大约100或更多行的数据正在传递,并且我不想杀死该应用程序,破坏网络或SQL Server。 这是我的存储过程 我希望这会为我带来一些帮助,就像我对此进行测试时一样 这就是我回来的 (影响1行) (影响1行) (影响1行) (

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为()。(如果使用/ 包装器) 在某些情况下,该策略被解析为to 或to ,因此您可能需要手动将其设置为or (取决于基础数据库)。 似乎 + 指定序列名称 对您有用。

  • 问题内容: 我在使用InnoDB的MySQL中有一个表,其中有一列名为“ id”的列。 所以我的问题是,每当我从表中删除最后一行然后插入新值时,新值都会在删除的ID之后插入。 我的意思是假设我的id是32,我想删除它,然后如果我在删除后插入新行,则列id会自动递增到33。因此序列格式被破坏了,即id = 30,31,33而且不是32。 因此,当我删除最后一列后插入时,请帮我分配ID 32(而不是3