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 的表的主要内容,如果未能解决你的问题,请参考以下文章