插入时DB2重复键错误,但在select count(*)之后工作

时间:2012-12-14 09:21:46

标签: insert count db2 duplicates ibm-midrange

我有一个 - 对我来说不为人知 - 的问题,而且我不知道它背后的逻辑/原因是什么。当我尝试在表中插入记录时,我收到一条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;

3 个答案:

答案 0 :(得分:2)

我希望看到这些陈述......但由于这个问题已经有一年了......我不会老去。

我认为问题可能是 由默认生成

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

始终传递NULL,传递非重复值或切换到GENERATED ALWAYS

答案 1 :(得分:1)

查看作业日志中的前面消息,了解导致此问题的具体信息。我不明白INSERT如何在COUNT(*)之后突然工作。请告诉我们您的发现。

由于它显示*N(即n / a)作为索引或约束的名称,这表明我不是标准的DB2对象,因此可能是“逻辑文件”[LF] ] defined with DDS而不是SQL,其键结构与您在COUNT(*)上的结构不同。

您的商店可能有更好的工具查看相关文件上的键,但下面的方法可以在任何地方使用。

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

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

您将在hereIBM i 7.1 Information Center

中找到DB2 for i消息查询器other releases

答案 2 :(得分:0)

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