2016-05-23 63 views
0

我使用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"但看起來相同。

+0

我不知道如果我理解你在問什麼 - 但需要考慮的兩件事:讓liquibase運行'updateSQL'而不是'update'。它將生成SQL語句,而不是直接在數據庫上運行它們。通過這種方式,您可以查看liquibase真正產生的效果。第二件事是:我也使用liquibase和hibernate,約束名稱看起來很像生成的hibernate。那麼你確定你的桌子真的是由liquibase生成的嗎? – Jens

回答

0

這是一個XY problem;如果有人按照我在這裏做的相同的路徑是我學到了...

真正的根本原因是表(和約束)創建(使用Liquibase),以符合與舊版本構建的應用程序休眠(v3)。

我們將應用程序升級到hibernate4,其hbm2ddl測試抱怨應用程序的註釋與實際數據庫中的一些不同的constaints。

從就是hbm2ddl錯誤消息,我還以爲是unique後綴是造成問題,但是,它僅僅是所需的約束名稱變更刪除constaint,準確地重新添加它是除與所需的約束名稱。

所以我做了進展,但在liquibase ....

<dropForeignKeyConstraint baseTableName="FooMetaData" constraintName="FK948B6448448663FC"/> 

<addForeignKeyConstraint 
    // SNIP   
    constraintName="UK_jbjctqk7dys3q0xr5brfsdjvv" 
// SNIP same attributes as original addForeignKeyConstraint 

,我並不需要改變什麼獨特(metaDataId)做