Grails 2.4.4 数据源“create-drop”无法删除所有具有 FK 的表

Posted

技术标签:

【中文标题】Grails 2.4.4 数据源“create-drop”无法删除所有具有 FK 的表【英文标题】:Grails 2.4.4 DataSource "create-drop" fails to drop all tables having FKs 【发布时间】:2015-03-16 23:08:33 【问题描述】:

使用 Grails 2.4.4,并从 2.2.0 移植了我的域类。

使用 mysql 作为数据源,我面临一个问题,即 DataSource 的“create-drop”配置。

每当我发出grails stop-app 命令时,在总共 35 个表中,架构中剩下 22 个表。

为 Hibernate 类启用调试模式后,在停止应用程序进程结束时,它为所有 35 个表生成drop table if exists <tablename>,但无论删除表是否成功,日志中都没有错误/确认.

剩下的表格有 FK 关联,需要按特定顺序删除。使用相同的 Domain 类结构,我在早期 (2.2.0) 版本的 grails 中从未遇到过这个问题。

现在我每次都在运行应用程序之前手动删除创建,因为它会导致 BootStrap 数据出现问题。

任何调试此问题的指针或可能发生这种情况的用例,都将不胜感激。

【问题讨论】:

您应该有 DDL 语句在删除表之前删除外键,例如alter table tablename drop foreign key FK_hrogx8ddq6cptuh5ru8uycn6s。运行grails schema-export 并查看target/ddl.sql 以查看Hibernate 生成的SQL。 感谢@BurtBeckwith。我运行 grails schema-export 并生成了文件,开始的 35 行是 drop table if exists <tablename> 。文件中没有alter table tablename drop foreign key <FK> 文件的结构如下:首先是 drop table if exists <tablename> ,然后是 create table <tablename> ,然后是 alter table add UK constraints & 创建索引,最后是 alter table add FK constrains 对不起,我非常抱歉,我最好暂时停止深夜工作。几天前我把这个文件ImprovedMySQLDialect 删除了this。所以我在不知不觉中阻止了FK的下降。所以为了摆脱这个其他问题,我需要实施一个更好的解决方案。应考虑覆盖 dropConstraints() 方法。感谢@BurtBeckwith 为我指明了正确的方向。 【参考方案1】:

对于我的情况,将 MySQL (v5.5.25) 的 FK-checks 设置为 0 解决了这个问题,尽管我不完全确定我是否应该使用 SET FOREIGN_KEY_CHECKS=0

如果有人有更好的解决方案,请分享。

编辑

问题是由于this 而面临的。经验教训 - 你不能盲目地复制粘贴随机代码~:-/

回答

谢谢伯特。

如果 DB 在 ddl 操作中表现异常。始终检查由grails schema-report 生成的ddl.sql,理想情况下应该具有以下结构

alter table <Table> drop constraint <Constraint>
...

drop table if exists <Table>
...

create table <Table>(...)
...

create index <Index> ...   --(if any)
...

alter table <Table> add constraint <Constraint>
....

【讨论】:

你在哪里设置了这个SET FOREIGN_KEY_CHECKS=0?能详细点吗? @Chetan : SET FOREIGN_KEY_CHECKS=0 是在 mysql 控制台会话中手动设置的,我在其中手动删除了所有表。 但实际问题出在我编写的自定义 MySQL5InnoDBDialect 类中,重写方法 public boolean dropConstraints() 返回 false

以上是关于Grails 2.4.4 数据源“create-drop”无法删除所有具有 FK 的表的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.4.4 与 Java 8 的兼容性

Spring安全导入在grails 2.4.4下不起作用

防止 Grails 2.4.4 接受无效日期

如何在 grails 2.4.4 中使用 mongodb?

Grails 2.4.4 中的 Spring Security 插件问题

热代码修复正在编译但未在 grails 2.4.4 中选择