我使用 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 列?
最佳答案
这是数据库引擎中的一个错误。问题是,使用了错误的索引(在您的例子中为 IDX1),然后数据库认为该行已被删除,而实际上它只是被更新。
现在已修复在后备箱中,位于 revision 5462 。将会在下一版本的H2中修复。
关于sql - H2 更新时违反参照完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591283/