我使用hibernate4 hbm2ddl来检查mysql模式是否是最新的。它告诉我,表需要改变:liquibase - 如何改变表使现有的约束唯一?
alter table ems.FooMetaData
drop constraint UK_jbjctqk7dys3q0xr5brfsdjvv
alter table ems.FooMetaData
add constraint UK_jbjctqk7dys3q0xr5brfsdjvv unique (metaDataId)
表是看起来像这样在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"
但看起来相同。
我不知道如果我理解你在问什么 - 但需要考虑的两件事:让liquibase运行'updateSQL'而不是'update'。它将生成SQL语句,而不是直接在数据库上运行它们。通过这种方式,您可以查看liquibase真正产生的效果。第二件事是:我也使用liquibase和hibernate,约束名称看起来很像生成的hibernate。那么你确定你的桌子真的是由liquibase生成的吗? – Jens