Grails 尝试删除主键时,数据库迁移失败,但有时会失败
非常奇怪的情况。我有一个根changelog.groovy,它是当前的生产数据库。我还有一个最新的changelog.groovy,它基本上是一个带有一些细微差异修正的差异(因为差异并不完美) 从一个空数据库开始,以下工作(场景1):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):
- mysqldump生产数据库
- 将源代码导入dev数据库
- 删除最新版本的include-changelog.groovy
- 执行dbm更改日志同步
- 添加最新版本的include-changelog.groovy
- 执行数据库管理更新
- 删除开发人员数据库
- 创建空的dev数据库
- 执行数据库管理更新
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;那里应该有一些有用的东西。