Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql AS400在插入PK Identity列的表时发生DB2重复键错误_Sql_Db2_Ibm Midrange - Fatal编程技术网

Sql AS400在插入PK Identity列的表时发生DB2重复键错误

Sql AS400在插入PK Identity列的表时发生DB2重复键错误,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,我得到了一个具有自动递增列的表,该列如下所示: ALTER TABLE SOMESCHEMA.SOMETABLE 更改列ID 设置默认生成的数据类型整数 将增量设置为1 不下命令 不设周期 将最小值设为1 设置最大值2147483647 不设置缓存; 只要我让DBMS生成Id,一切正常,我可以通过以下方式获得生成的Id: 从sysibm.sysdummy1中选择IDENTITY\u VAL\u LOCAL() 但有时我需要插入一行,其中包含我选择的ID,这样我就会遇到麻烦 假设表中有一行ID

我得到了一个具有自动递增列的表,该列如下所示:

ALTER TABLE SOMESCHEMA.SOMETABLE
更改列ID
设置默认生成的数据类型整数
将增量设置为1
不下命令
不设周期
将最小值设为1
设置最大值2147483647
不设置缓存;
只要我让DBMS生成Id,一切正常,我可以通过以下方式获得生成的Id:

从sysibm.sysdummy1中选择IDENTITY\u VAL\u LOCAL()
但有时我需要插入一行,其中包含我选择的ID,这样我就会遇到麻烦

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

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

因此,我尝试用以下方法重置此字段:

ALTER TABLE SOMESCHEMA.SOMETABLE ALTER列ID用3重新启动
但这会导致永久表锁,我不知道如何解锁


如何使此“混合模式”ID列正常工作?是否有可能让它像MySQL一样工作,在MySQL中,DBMS会在手动插入Id后自动更新“NextID”?如果没有,我如何释放在尝试重置NextId时弹出的{insert sword here}锁?

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

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

因此,问题的根源在于DB2希望以独占方式访问该表。这在某种程度上是一个设计问题,因为人们通常不会在工作日操纵表的结构。当涉及到ID号时,这张表听起来好像有时是父表,有时是子表。如果是这样的话,我可以建议你再换一次桌子吗


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

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

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

因此,问题的根源在于DB2希望以独占方式访问该表。这在某种程度上是一个设计问题,因为人们通常不会在工作日操纵表的结构。当涉及到ID号时,这张表听起来好像有时是父表,有时是子表。如果是这样的话,我可以建议你再换一次桌子吗

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

ALTER TABLE table_name ALTER COLUMN column_name RESTART WITH 99999;
修正了我的问题。例如,“99999”是下一个要使用的ID


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

我不相信有“永久表锁”这样的东西。锁在事务提交时被释放。直到我偶然发现这个问题,我也这么认为。在ID重置后,我仍然会得到以下错误:SQL0913 Zeile Order Objekt SOMETABLE der Art*文件位于Bibliothek SOMESCHEMA wird verwendet中。直到我手动杀死“Qzdasoinit”通过iSeries Navigator或CLI执行作业该表保持独立锁定您是否必须在更改表后发出显式提交?我在启用自动提交和显式提交的情况下尝试了该语句。没有区别(不幸的是)。我不相信有“永久表锁”这样的东西。锁在事务提交时被释放。直到我偶然发现这个问题,我也这么认为。在ID重置后,我仍然会得到以下错误:SQL0913 Zeile Order Objekt SOMETABLE der Art*文件位于Bibliothek SOMESCHEMA wird verwendet中。直到我手动杀死“Qzdasoinit”通过iSeries Navigator或CLI执行作业该表保持独立锁定您是否必须在更改表后发出显式提交?我在启用自动提交和显式提交的情况下尝试了该语句。没有区别(不幸的是)。当使用触发器而不是标识列时,对Id字段的并发访问是否存在可能的问题?我不确定是否有可能通过这种方式获得相同的ID(我以前从未使用过这种方式的触发器)。是的,SELECT MAX(ID)可能存在并发问题,因为两个进程可以运行得足够近,从而获得sam