liquibase - 如何更改 table 以使现有约束唯一?
liquibase - how to alter table to make a existing constraint unique?
我正在使用 hibernate4 hbm2ddl 检查 mysql 模式是否是最新的。它告诉我 table 需要更改 :
alter table ems.FooMetaData
drop constraint UK_jbjctqk7dys3q0xr5brfsdjvv
alter table ems.FooMetaData
add constraint UK_jbjctqk7dys3q0xr5brfsdjvv unique (metaDataId)
table 在 MySQL 中看起来像这样:
mysql> show create table FooMetaData;
| FooMetaData | CREATE TABLE `FooMetaData` (
`fooMemberId` int(11) DEFAULT NULL,
`metaDataId` varchar(255) DEFAULT NULL,
KEY `FK948B6448448663FC` (`metaDataId`),
KEY `FK948B64486FA1E99D` (`fooMemberId`),
CONSTRAINT `FK948B6448448663FC` FOREIGN KEY (`metaDataId`) REFERENCES `BarValues` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK948B64486FA1E99D` FOREIGN KEY (`fooMemberId`) REFERENCES `Foos` (`fooMemberId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
它是使用 Liquibase(版本 3.4.2)创建的
<changeSet author="myauthor" id="myid">
<addForeignKeyConstraint baseColumnNames="metaDataId"
baseTableName="FooMetaData" baseTableSchemaName="foo" constraintName="FK948B6448448663FC"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="id" referencedTableName="BarValues"
referencedTableSchemaName="foo" referencesUniqueColumn="false"/>
</changeSet>
如何使用唯一 (metaDataId) 更新约束?
我尝试在 liquibase 的 hbm2ddl 中删除该约束并添加 referencesUniqueColumn="true"
但看起来一样。
这是一个XY problem;以防其他人走上与我相同的道路,这就是我学到的...
真正的根本原因是创建表(和约束)(使用 Liquibase)以符合使用旧版本休眠 (v3) 构建的应用程序。
我们将应用程序升级到 hibernate4,其 hbm2ddl 测试抱怨应用程序注释中的一些约束与真实数据库不同。
根据 hbm2ddl 错误消息,我认为是 unique
后缀导致了问题,然而,只是 需要更改约束名称 删除约束并重新添加它,除了所需的约束名称之外。
所以我取得了进步,但在 liquibase ....
<dropForeignKeyConstraint baseTableName="FooMetaData" constraintName="FK948B6448448663FC"/>
<addForeignKeyConstraint
// SNIP
constraintName="UK_jbjctqk7dys3q0xr5brfsdjvv"
// SNIP same attributes as original addForeignKeyConstraint
而且我不需要更改与唯一 (metaDataId) 有关的任何内容
我正在使用 hibernate4 hbm2ddl 检查 mysql 模式是否是最新的。它告诉我 table 需要更改 :
alter table ems.FooMetaData
drop constraint UK_jbjctqk7dys3q0xr5brfsdjvv
alter table ems.FooMetaData
add constraint UK_jbjctqk7dys3q0xr5brfsdjvv unique (metaDataId)
table 在 MySQL 中看起来像这样:
mysql> show create table FooMetaData;
| FooMetaData | CREATE TABLE `FooMetaData` (
`fooMemberId` int(11) DEFAULT NULL,
`metaDataId` varchar(255) DEFAULT NULL,
KEY `FK948B6448448663FC` (`metaDataId`),
KEY `FK948B64486FA1E99D` (`fooMemberId`),
CONSTRAINT `FK948B6448448663FC` FOREIGN KEY (`metaDataId`) REFERENCES `BarValues` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `FK948B64486FA1E99D` FOREIGN KEY (`fooMemberId`) REFERENCES `Foos` (`fooMemberId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
它是使用 Liquibase(版本 3.4.2)创建的
<changeSet author="myauthor" id="myid">
<addForeignKeyConstraint baseColumnNames="metaDataId"
baseTableName="FooMetaData" baseTableSchemaName="foo" constraintName="FK948B6448448663FC"
deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION"
referencedColumnNames="id" referencedTableName="BarValues"
referencedTableSchemaName="foo" referencesUniqueColumn="false"/>
</changeSet>
如何使用唯一 (metaDataId) 更新约束?
我尝试在 liquibase 的 hbm2ddl 中删除该约束并添加 referencesUniqueColumn="true"
但看起来一样。
这是一个XY problem;以防其他人走上与我相同的道路,这就是我学到的...
真正的根本原因是创建表(和约束)(使用 Liquibase)以符合使用旧版本休眠 (v3) 构建的应用程序。
我们将应用程序升级到 hibernate4,其 hbm2ddl 测试抱怨应用程序注释中的一些约束与真实数据库不同。
根据 hbm2ddl 错误消息,我认为是 unique
后缀导致了问题,然而,只是 需要更改约束名称 删除约束并重新添加它,除了所需的约束名称之外。
所以我取得了进步,但在 liquibase ....
<dropForeignKeyConstraint baseTableName="FooMetaData" constraintName="FK948B6448448663FC"/>
<addForeignKeyConstraint
// SNIP
constraintName="UK_jbjctqk7dys3q0xr5brfsdjvv"
// SNIP same attributes as original addForeignKeyConstraint
而且我不需要更改与唯一 (metaDataId) 有关的任何内容