【问题标题】:H2 Referential integrity constraint violation on updateH2 更新时违反参照完整性约束
【发布时间】: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 列?

【问题讨论】:

    标签: sql h2


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2015-05-26
      • 2017-12-25
      • 1970-01-01
      • 2020-01-14
      相关资源
      最近更新 更多