【问题标题】:DBUnit/HSQL how to initialize db with table having self foreign keys?DBUnit/HSQL 如何使用具有自外键的表初始化 db?
【发布时间】:2021-09-14 15:09:30
【问题描述】:

我想用 DBUnit 初始化 HSQL 数据库。我有一张这样的桌子:

table EMPLOYEE( id, name, manager_id) // manager_id is nullable
     CONSTRAINT "fk_manager" FOREIGN KEY ("manager_id")
     REFERENCES EMPLOYEE("id)

问题是当我尝试使用此数据集进行初始化时:

<dataset>
  <EMPLOYEE id="2" name="John" manager_id="5"/> <!--Doe is the John's manager-->
  <EMPLOYEE id="3" name="Doe" manager_id="4"/> <!--Kong is the Does's manager-->
  <EMPLOYEE id="4" name="Kong" manager_id="2"/> <!-- John is the Kong's manager-->
</dataset>

我有这个例外:

Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no parent; fk_manager table: EMPLOYEE

如何解决该错误?谢谢

【问题讨论】:

    标签: java foreign-keys relational-database hsqldb dbunit


    【解决方案1】:

    您需要插入没有managerId 的第一行,并在插入包含managerId 的行后添加此值

    INSERT INTO EMPLOYEE (id, name, managerId) VALUES (2, 'John', null)
    INSERT INTO EMPLOYEE (id, name, managerId) (VALUES 4, 'Kong', 2)
    INSERT INTO EMPLOYEE (id, name, managerId) (VALUES 3, 'Doe', 4)
    UPDATE EMPLOYEE SET managerId = 3 WHERE id = 2 
    

    也可以在插入期间关闭外键约束检查。您的数据集应该是一致的,并且不应包含对不存在的行的外键引用。

    http://hsqldb.org/doc/2.0/guide/management-chapt.html#mtc_database_settings

    SET DATABASE REFERENTIAL INTEGRITY FALSE
    -- perform the inserts
    SET DATABASE REFERENTIAL INTEGRITY TRUE
    

    【讨论】:

    • 感谢您的回答。问题是所有数据集都是从数据库加载的,使用此解决方案我将有太多行需要手动修改。
    猜你喜欢
    • 1970-01-01
    • 2017-06-28
    • 2014-12-14
    • 2022-12-05
    • 2016-04-18
    • 2013-06-19
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    相关资源
    最近更新 更多