使用PK标识列在表中插入期间AS400 DB2重复键错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PK标识列在表中插入期间AS400 DB2重复键错误相关的知识,希望对你有一定的参考价值。

我有一个带有自动增量列的表,看起来像:

ALTER TABLE SOMESCHEMA.SOMETABLE 
    ALTER COLUMN ID 
        SET DATA TYPE INTEGER GENERATED BY DEFAULT 
        SET INCREMENT BY 1 
        SET NO ORDER 
        SET NO CYCLE 
        SET MINVALUE 1 
        SET MAXVALUE 2147483647 
        SET NO CACHE;

只要我让DBMS生成ID,一切正常,我可以通过以下方式获取生成的Id:

SELECT IDENTITY_VAL_LOCAL() FROM sysibm.sysdummy1

但有时我需要插入一个带有我选择ID的行,并且我遇到了麻烦。

假设我们在表中有一行ID为1。 现在我插入一个手动分配id为2的新行。 下次我尝试插入没有预设ID的新行时,我收到错误SQL0803“DUPLICATE KEY”。

我假设如果手动设置了行的Id,则该自动增量列的内部“NextId”字段不会自动更新。

所以我尝试使用以下方法重置此字段:

ALTER TABLE SOMESCHEMA.SOMETABLE ALTER COLUMN ID RESTART WITH 3

但这导致永久的表锁,我不知道如何解锁。

如何才能使这种“混合模式”ID列工作?是否有可能让它像mysql一样工作,DBMS会在手动ID插入时自动更新“NextID”?如果没有,如果我尝试重置NextId,如何释放弹出的{insert swear-word here}锁定?

答案

SQL0913没有创建锁 - 它报告存在锁。 ALTER TABLE需要对表进行独占锁定才能重置ID号。一个表可以被另一个打开的进程锁定,或者如果有未提交的行,它可以被此进程锁定。

该表正在使用中还有另一个原因 - 软关闭(或伪关闭)。出于性能原因,DB2 for i将游标保留在内存中,以便尽可能高效地重用它们。因此,即使您说CLOSE CURSOR,DB2也会将其保留在内存中。这些软关闭游标可以通过命令ALCOBJ OBJ((SOMSCHEMA/SOMETABLE *FILE *EXCL)) WAIT(1) CONFLICT(*RQSRLS)关闭.CONFLICT(* RQSRLS)参数告诉DB2关闭所有软关闭游标。

所以问题的根源是DB2想要对表进行独占访问。这是一种设计问题,因为通常一个人不会在工作日操纵表的结构。这听起来好像这个表有时是父母,有时候是儿童身份证。如果是这种情况,我可以建议您再次更换表格吗?

我认为如果使用触发器而不是自动增量,实现可能会更好。在INSERT上触发触发器。如果提供了ID,则不执行任何操作。如果未提供ID,则选择MAX(ID)+1并将其用作您提交给数据库的实际ID号。

另一答案
ALTER TABLE table_name ALTER COLUMN column_name RESTART WITH 99999;

解决了我的问题。例如,“99999”是下一个要使用的ID

以上是关于使用PK标识列在表中插入期间AS400 DB2重复键错误的主要内容,如果未能解决你的问题,请参考以下文章

db2数据库某一个表增加新列后,如何改变该列在表中的排序?表右方的“上移”和“下移”好像都用不了。

通过 JBDC 获取在 IBM DB2 V6R1 (AS400) 上插入的行数

尝试在表中插入不存在的记录时出现 DB2 -803 错误

在表中插入数据,在一个查询中使用 FK 更新其他表

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“tbl Fingerprint”中插入标识列的显式值 [重复]

使用 C# 出现错误“无法在表中插入标识列的显式值”