【问题标题】:Grails GORM and MYSQL cascade delete problemGrails GORM 和 MYSQL 级联删除问题
【发布时间】:2010-12-09 16:43:37
【问题描述】:

我有一个表 User,它在静态 hasMany 下的 User 类中定义了许多子表 圣杯。

在 grails 中执行 User.get(3).delete() 时没有问题。它会自动删除该用户及其所有子表行。 但是当我想在 MySQL 工作台中执行相同的操作时。我得到 MySQL 抛出的错误:

ERROR 1451: Cannot delete or update a parent row: a foreign key constraint fails (`test_db`.`search_stat`, CONSTRAINT `FK7A3CFFB6E64DB41` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))
SQL Statement:
DELETE FROM `test_db`.`user` WHERE `id`='3'

我不知道 MySQL 有什么问题。

【问题讨论】:

  • 查看MySQL中表的定义。外键是否设置了“ON DELETE CASCADE”,或者 GORM/Hibernate 是否在幕后代码中进行级联?
  • 我在 MYSQL 工作台中检查过,但在 Foreing Keys 选项卡下它没有显示任何外键。其下的 Foreing Key Names 和 Reference Table 选项卡为空白。当我单击空白时,它会自动创建 fk_user_1 并单击下一个选项卡,下拉菜单显示数据库中的所有表,供我选择一个作为引用表。但我认为出了点问题,我不需要重新创建外键。我尝试在 mysql 命令行版本中删除命令,我得到了同样的错误。
  • 另一方面,Grails GORM 文档清楚地表明,belongsTo 会在删除/更新行为时自动创建级联。因此,当 GORM 在 MySQL db 中创建表时,这种行为应该已经进入 db 模式。

标签: mysql grails grails-orm mysql-error-1451


【解决方案1】:

您从哪里读到文档中的“ON DELETE CASCADE”?我还没有找到它herethis post 的发帖人也必须手动添加它才能获得所需的行为。

如果 grails 真的应该添加这个,您是否尝试过删除数据库并让 grails 重新创建它(至少在开发环境中)?也许当前架构是在您添加 belongsTo 之前生成的?

还可以查看this Blog post about GORM Gotchas regarding hasMany and belongsTo.

【讨论】:

  • grails.org/doc/1.0.x/guide/… 它明确表示:默认的级联行为是级联保存和更新,但除非还指定了 belongsTo,否则不会删除。
  • 好的,但它并没有说这是在 SQL 中使用“ON DELETE CASCADE”“实现”的,不是吗?也许它只是使用单独的 SQL 语句级联删除的 grails 功能。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多