2014-02-06 55 views
2

我使用H2进行集成测试,我有这种奇怪的行为,我无法解释。下面是步骤重新创建:H2更新时引用完整性约束违规

DROP TABLE IF EXISTS A; 
DROP TABLE IF EXISTS B; 
CREATE TABLE A(ID INT PRIMARY KEY, COLUMN1 VARCHAR(255)); 
CREATE TABLE B(ID INT PRIMARY KEY, A_ID INT, COLUMN1 VARCHAR(255)); 
ALTER TABLE B ADD FOREIGN KEY (A_ID) REFERENCES A(ID); 
INSERT INTO A VALUES(1,'foo'); 
INSERT INTO B VALUES(1,1,'foo'); 
CREATE INDEX IDX1 ON A(ID,COLUMN1); 
ALTER TABLE A ADD COLUMN COLUMN2 VARCHAR(255); 
UPDATE A SET COLUMN1='bar'; 

这最后更新生成以下错误: 参照完整性约束违规: “CONSTRAINT_42_1:PUBLIC.B外键(A_ID)参考文献PUBLIC.A(ID)(1)”; 我试过与HSQLDB相同的步骤成功(没有参照完整性约束违规)。 我发现使它与H2一起工作的唯一解决方法是在添加列之前删除索引并再次重新创建相同的索引。

有没有什么理由为什么H2会抱怨违规,我没有看到,因为我没有更新ID列?

回答

2

这是数据库引擎中的一个错误。问题是,使用了错误的索引(在你的情况下是IDX1),然后数据库认为该行被删除,实际上它只被更新。

这现在固定在中继线,在revision 5462。它将在H2的下一个版本中得到修复。

相关问题