HSQLDB无法删除未找到的外键约束对象

时间:2015-08-28 08:05:00

标签: hsqldb liquibase

我们的HSQLDB数据库具有从PAYMENTS表到USERS表的FK约束。我们在这里做错了是创建一个约束而不给它一个特定的名称。这会导致HSQLDB为您生成名称,例如SYS_FK_10985。

我所做的是为Liquibase编写一个自定义更改集,它将找到索引的名称并将其删除。脚本的功能非常简单:

SELECT constraint_name FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME= 'PAYMENTS' AND COLUMN_NAME= 'USER_ID';

如果找到,则通过在同一更改集中执行的以下查询删除它:

ALTER TABLE PAYMENTS DROP CONSTRAINT SYS_FK_10985;

补丁已成功执行,并且drop constraint命令被添加到HSQLDB的.log文件中,但是,当我们想要运行HSQLDB实例时,它会抛出一个错误,指出无法找到该对象。

HSQLDB throws exception

日志文件如下所示:

DB log file

主要问题是日志文件中丢失了错误的索引(不存在的索引),这自然会导致HSQLDB抛出异常。更糟糕的是:当异常发生时,该行之后的所有内容都会从日志文件中删除,甚至不会存储在.data文件中。

约束名称是否可能更改导致更改集名称错误?

1 个答案:

答案 0 :(得分:1)

您需要在此操作或任何一系列结构更改后立即执行CHECKPOINT。

CHECKPOINT将更改保留在.script文件中,并删除.log文件,避免出现问题。