我有一个 - 对我来说不为人知 - 的问题,而且我不知道它背后的逻辑/原因是什么。当我尝试在表中插入记录时,我收到一条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;
答案 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
。 (关于你的奇怪异常的远程可能原因的疯狂的长期猜测。)
您将在here或IBM i 7.1 Information Center
中找到DB2 for i消息查询器other releases答案 2 :(得分:0)
是分页问题吗?当一行被保存用于更新时,我们似乎偶尔会在插入时得到-0803,它会锁定一个可能包含插入所需索引的页面?这只是猜测,但在我看来,这就是正在发生的事情。