我使用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 FOREIGN KEY(A_ID)REFERENCES PUBLIC.A(ID)(1)”; 我已经尝试了与HSQLDB相同的步骤(没有引用完整性约束违规)。 我发现使其适用于H2的唯一解决方法是在添加列之前删除索引并再次重新创建相同的索引。
有什么理由说H2会抱怨违规,我没有看到,因为我没有更新ID列?
答案 0 :(得分:2)
这是数据库引擎中的错误。问题是,使用了错误的索引(在您的情况下为IDX1),然后数据库认为该行已被删除,实际上它只是更新了。
现在已在revision 5462中的行李箱中修复此问题。它将在下一版H2中修复。