我有一个未知的问题,我不知道它背后的逻辑/原因是什么。当我试图在表中插入一条记录时,我得到一个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语句!:)