sql - H2 更新时违反参照完整性约束

标签 sql 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 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/

相关文章:

MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中且包含非聚合列

mysql - 从 SQL 表中删除重复项

java - H2 WebServer 打开带有预填充信息的 Web 控制台

h2 - H2尝试在无效位置创建数据库

java - 如何在Cloud Foundry中创建共享H2服务器?

java - 玩!没有正确关闭 H2

MySQL组加入空值

sql - 独特的前 5 名随机查询

php - 一个查询中的文章和评论

Java Play框架+H2数据库,并发操作性能