问题是,要重命名的列是外键约束的一部分。
解决方法是首先删除约束,然后再添加新的列名。但是,如果所有这些操作都是在相同的变更集中完成的,结果也不例外。所以它必须分成两个变更集:首先,删除约束和重命名列,然后重新创建外键约束。
<changeSet author="me" id="renameaTob">
<dropForeignKeyConstraint baseTableName="aTable" constraintName="a_c_fk2"/>
<renameColumn newColumnName="b" oldColumnName="a" columnDataType="BIGINT(19)" tableName="aTable" />
</changeSet>
<changeSet author="me" id="addFkAgain">
<addForeignKeyConstraint baseColumnNames="b"
baseTableName="aTable" constraintName="b_c_fk2"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION"
onUpdate="NO ACTION" referencedColumnNames="c" referencedTableName="refTable" />
</changeSet>
我认为它也可以只使用一个变更,并添加runInTransaction='false'
,但这并不是一个好主意,反正。
我建议将更改作为3个独立的changeSets。做了相同的更改,但由于Liquibase会分别跟踪每个变量,所以如果changeSet的前半部分传递(dropForeignKey),但第二个失败(renameColumn),则不会遇到问题。如果发生这种情况,在下次更新时,liquibase仍然会尝试运行dropForeignKeyConstraint,但它会失败,并显示OBJECT NOT EXISTS错误。 – 2014-10-30 19:57:06
RunInTransaction不会影响这些特定的changeSet,因为所有语句都会在大多数数据库上自动提交。 runInTransaction = false的主要用途是针对事务中不允许DDL语句的数据库。 – 2014-10-30 19:57:24