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

HSQLDB unable to drop foreign key constraint object not found

我们的 HSQLDB 数据库有一个 FK 约束,从付款 table 到用户 table。我们在这里做错的是创建了一个约束但没有给它一个特定的名称。这会导致 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;

补丁执行成功,删除约束命令被添加到HSQLDB的.log文件中,但是,当我们想要运行 HSQLDB实例时,它抛出一个错误说对象不能找到了。

日志文件如下所示:

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

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

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

CHECKPOINT 将更改保存到 .script 文件中并删除 .log 文件,避免了问题的出现。