Grails 尝试删除主键时,数据库迁移失败,但有时会失败

Grails 尝试删除主键时,数据库迁移失败,但有时会失败,grails,database-migration,liquibase,composite-primary-key,Grails,Database Migration,Liquibase,Composite Primary Key,非常奇怪的情况。我有一个根changelog.groovy,它是当前的生产数据库。我还有一个最新的changelog.groovy,它基本上是一个带有一些细微差异修正的差异(因为差异并不完美) 从一个空数据库开始,以下工作(场景1): mysqldump生产数据库 将源代码导入dev数据库 删除最新版本的include-changelog.groovy 执行dbm更改日志同步 添加最新版本的include-changelog.groovy 执行数据库管理更新 以下情况不起作用(场景2):

非常奇怪的情况。我有一个根changelog.groovy,它是当前的生产数据库。我还有一个最新的changelog.groovy,它基本上是一个带有一些细微差异修正的差异(因为差异并不完美)

从一个空数据库开始,以下工作(场景1):

  • mysqldump生产数据库
  • 将源代码导入dev数据库
  • 删除最新版本的include-changelog.groovy
  • 执行dbm更改日志同步
  • 添加最新版本的include-changelog.groovy
  • 执行数据库管理更新
以下情况不起作用(场景2):

  • 删除开发人员数据库
  • 创建空的dev数据库
  • 执行数据库管理更新
所发生的是最初的changelog.groovy运行顺利。但是当它到达最新版本-changelog.groovy时,它会失败,原因如下:

changeSet(author: "gdboling (generated)", id: "1341248060406-72") {
  addPrimaryKey(columnNames: "book_project_id, note_id", constraintName: "book_project_PK", tableName: "book_project_note")
}
原因:java.sql.SQLException:的重命名错误 “./main_dev/#sql-b4_2334”至 “/主要开发/书籍项目注释”(错误号:150)

我有一个定义如下的表:

mysql> desc book_project_note;
+---------------------------+------------+------+-----+---------+-------+
| Field                     | Type       | Null | Key | Default | Extra |
+---------------------------+------------+------+-----+---------+-------+
| book_project_id           | bigint(20) | NO   | PRI | NULL    |       |
| note_id                   | bigint(20) | NO   | PRI | NULL    |       |
| book_project_note_type_id | bigint(20) | NO   | PRI | NULL    |       |
+---------------------------+------------+------+-----+---------+-------+
以下更改集失败:

changeSet(author: "gdboling (generated)", id: "1341248060406-80") {
  dropPrimaryKey(tableName: "book_project_note")
}
我在这里尝试的是删除主键,然后使用以下命令重新创建其中的2个:

changeSet(author: "gdboling (generated)", id: "1341248060406-72") {
  addPrimaryKey(columnNames: "book_project_id, note_id", constraintName: "book_project_PK", tableName: "book_project_note")
}

我想知道为什么它在场景1中有效,但在场景2中失败,我不确定这是问题的实际答案,但我已经找出了导致失败的原因。book_project_note表上有3个FK。这些FK必须在dropPrimaryKey(duh)之前删除


然而,这仍然没有告诉我它在场景1中是如何工作的,但我认为它可能与addForeignKeyConstraint中的可延迟属性有关。仍在努力研究这实际上意味着什么。

您可以尝试运行dbm update sql来查看生成的sql;那里应该有一些有用的东西。