【问题标题】:Grails 2.4.4 DataSource "create-drop" fails to drop all tables having FKsGrails 2.4.4 数据源“create-drop”无法删除所有具有 FK 的表
【发布时间】: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 为我指明了正确的方向。

标签: mysql grails grails-2.0 hibernate-4.x


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 2023-03-10
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多