我使用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