【问题标题】:Database-migration fails when trying to drop primary keys, but only sometimes尝试删除主键时数据库迁移失败,但只是有时
【发布时间】:2012-07-09 06:47:14
【问题描述】:

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

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

  • mysqldump 生产数据库
  • 源到开发数据库
  • 删除包含 latest-changelog.groovy
  • 执行 dbm-changelog-sync
  • 添加包含 latest-changelog.groovy
  • 执行 dbm 更新

以下方法不起作用(场景 2):

  • 删除开发数据库
  • 创建空的开发数据库
  • 执行数据库更新

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

原因:java.sql.SQLException:重命名错误 './main_dev/#sql-b4_2334' 到 './main_dev/book_project_note' (errno: 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 中失败。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 您可以尝试运行 dbm-update-sql 来查看生成的 SQL;那里应该有一些有用的东西。
    猜你喜欢
    • 2017-01-13
    • 2016-11-15
    • 2015-10-14
    • 1970-01-01
    • 2019-12-22
    • 2020-10-30
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多