HSQLDB 无法删除未找到的外键约束对象
Posted
技术标签:
【中文标题】HSQLDB 无法删除未找到的外键约束对象【英文标题】:HSQLDB unable to drop foreign key constraint object not found 【发布时间】:2015-08-28 08:05:00 【问题描述】:我们的 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约束命令被添加到HSQLDB的.log文件中,但是,当我们想要运行HSQLDB实例时,它会抛出一个错误,说找不到对象。
日志文件如下:
主要问题是日志文件中删除了错误的索引(一个不存在的索引),这自然会导致 HSQLDB 抛出异常。更糟糕的是:发生异常时,该行之后的所有内容都会从日志文件中删除,甚至不会存储在 .data 文件中。
是否有可能约束名称更改导致更改集获得错误名称?
【问题讨论】:
除非是与图形相关的问题,否则请不要将屏幕截图粘贴到问题中。文字更好。 【参考方案1】:您需要在此操作或任何一系列结构更改之后立即执行 CHECKPOINT。
CHECKPOINT 将更改保存到 .script 文件并删除 .log 文件,避免出现问题。
【讨论】:
以上是关于HSQLDB 无法删除未找到的外键约束对象的主要内容,如果未能解决你的问题,请参考以下文章
原因:java.sql.SQLException:无法删除表“投票”上的外键约束“FK336ctjyksuuwnpmffcogcdyet”引用的表“链接”