插入时出现DB2重复密钥错误,但在选择计数(*)后仍在工作



我有一个未知的问题,我不知道它背后的逻辑/原因是什么。当我试图在表中插入一条记录时,我得到一个DB2错误,说:

[SQL0803] Duplicate key value specified: A unique index or unique constraint *N in *N
exists over one or more columns of table TABLEXXX in SCHEMAYYY. The operation cannot 
be performed because one or more values would have produced a duplicate key in 
the unique index or constraint.

这对我来说是一个非常明确的信息。但是实际上,如果我插入我的新记录,看看里面已经有什么记录,就不会有重复的密钥。当我做一个SELECT COUNT(*) from SCHEMAYYY.TABLEXXX,然后尝试插入记录时,它可以完美地工作。

在执行SELECT COUNT(*)时,我怎么会突然插入记录?是否有某种索引与它相关,可能会因为它不同步而出现问题?我没有设计数据模型,所以我对系统还没有深入的了解。

最初的DB2 SQL是:

--  Generate SQL 
--  Version:                    V6R1M0 080215 
--  Generated on:               19/12/12 10:28:39 
--  Relational Database:        S656C89D 
--  Standards Option:           DB2 for i 
CREATE TABLE TZVDB.PRODUCTCOSTS ( 
ID INTEGER GENERATED BY DEFAULT AS IDENTITY ( 
START WITH 1 INCREMENT BY 1 
MINVALUE 1 MAXVALUE 2147483647 
NO CYCLE NO ORDER 
CACHE 20 ) 
, 
PRODUCT_ID INTEGER DEFAULT NULL , 
STARTPRICE DECIMAL(7, 2) DEFAULT NULL , 
FROMDATE TIMESTAMP DEFAULT NULL , 
TILLDATE TIMESTAMP DEFAULT NULL , 
CONSTRAINT TZVDB.PRODUCTCOSTS_PK PRIMARY KEY( ID ) ) ; 
ALTER TABLE TZVDB.PRODUCTCOSTS 
ADD CONSTRAINT TZVDB.PRODCSTS_PRDCT_FK 
FOREIGN KEY( PRODUCT_ID ) 
REFERENCES TZVDB.PRODUCT ( ID ) 
ON DELETE RESTRICT 
ON UPDATE NO ACTION;

我想看看这些语句。。。但既然这个问题已经存在一年了。。。我不会老口气的。

我想问题可能是默认生成

您第一次意外地传递了零或其他重复值,而不是为标识列传递NULL。

始终传递NULL、传递不重复的值或切换到GENERATED always

查看作业日志中前面的消息,了解导致这种情况的具体原因。我不明白INSERT怎么会在COUNT(*)之后突然起作用。请告诉我们您的发现。

由于它将*N(即n/a)显示为索引或约束的名称,这向我表明它不是一个标准的DB2对象,因此可能是一个用DDS而不是SQL定义的"逻辑文件"[LF],其键结构与您在上面执行COUNT(*)时的键结构不同。

你的商店可能有更好的工具来查看依赖文件上的密钥,但下面的方法在任何地方都适用。

如果您的表可能不是实际的"物理文件",请在5250("绿屏")会话中使用"显示文件描述"DSPFD TZVDB.PRODUCTCOSTS进行检查。

使用"显示数据库关系"命令DSPDBR TZVDB.PRODUCTCOSTS可以查找在表上定义的文件。然后,您可以在这些文件中的每一个上DSPFD,以查看索引键的定义。还要检查这些索引中的每一个是否保持为*IMMED,而不是*REBUILD*DELAY。(这是一个关于你奇怪异常的遥远原因的长期猜测。)

您可以在IBMi7.1信息中心或其他版本的中找到DB2fori消息查找器

这是分页问题吗?当一行被保留以进行更新,并且它锁定了一个可能包含插入所需索引的页面时,我们似乎偶尔会在插入时得到-0803?这只是一个猜测,但在我看来,这就是正在发生的事情。

我知道这是一个老话题,但这是谷歌首先向我展示的
我昨天也有同样的问题,让我非常头疼。我做了与上面相同的操作,检查了表定义、键、现有项
然后我发现问题出在INSERT语句上。它试图同时插入相同的记录,但由于约束阻止了提交,我在数据库中找不到任何内容
建议:仔细查看INSERT语句!:)

相关内容

  • 没有找到相关文章

最新更新