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

Posted

技术标签:

【中文标题】H2 更新时违反参照完整性约束【英文标题】:H2 Referential integrity constraint violation on update 【发布时间】:2014-02-06 00:00:19 【问题描述】:

我使用 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 列?

【问题讨论】:

【参考方案1】:

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

这个问题现在在主干中修复,在revision 5462 中。将在下一个 H2 版本中修复。

【讨论】:

以上是关于H2 更新时违反参照完整性约束的主要内容,如果未能解决你的问题,请参考以下文章

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:违反参照完整性约束

Hibernate/H2 @OneToMany 删除子时“违反参照完整性约束”?

JPA 中的参照完整性约束违反错误

Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败

SQLSTATE [23000]:违反完整性约束:1217

ORA-02291: 违反完整约束条件 (*) - 未找到父项关键字