2016-05-23 38 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)做