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

时间:2012-07-09 20:12:05

标签: grails database-migration liquibase composite-primary-key

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

从空数据库开始,以下工作(方案1 ):

  • mysqldump生产数据库
  • source into dev database
  • 删除包含latest-changelog.groovy
  • 执行dbm-changelog-sync
  • 添加包含latest-changelog.groovy
  • 执行dbm-update

以下内容不起作用(场景2 ):

  • drop dev database
  • 创建空的dev数据库
  • 执行dbm-update

最初的changelog.groovy会顺利运行。但是当它到达最新的changelog.groovy时,它会失败并显示以下内容:

  

引起:java.sql.SQLException:重命名时出错   './main_dev/#sql-b4_2334'到   './main_dev/book_project_note'(错误号: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")
}

我在这里要做的是删除主键,然后使用以下内容重新创建其中的两个:

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

我想知道为什么它适用于场景1 ,但在场景2 中失败。

1 个答案:

答案 0 :(得分:1)

不确定这是问题的实际答案,但我已经找出导致其失败的原因。 book_project_note表上有3个FK。那些FK必须在dropPrimaryKey(duh)之前删除。

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