3

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

这对我来说是一个非常明确的信息。实际上,如果我插入我的新记录,看看那里已经有什么记录,就不会有重复的键。当我做 aSELECT 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;
4

3 回答 3

2

我想看看这些陈述……但由于这个问题已经存在一年了……我不会老去。

我在想问题可能是默认生成的

而不是为标识列传递 NULL ,而是第一次不小心传递了零或其他一些重复值。

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

于 2014-01-26T01:56:34.920 回答
1

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

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

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

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

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

您将在 IBM i 7.1 信息中心或其他发行版中找到 DB2 for i消息查找

于 2012-12-16T20:02:31.713 回答
0

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

于 2016-07-05T21:45:44.413 回答