liquibase - 如何更改表以使现有约束唯一?

时间:2016-05-23 10:55:54

标签: hibernate jpa liquibase hbm2ddl

我正在使用hibernate4 hbm2ddl来检查mysql架构是否是最新的。它告诉我表需要改变:

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"但看起来相同。

1 个答案:

答案 0 :(得分:0)

这是XY problem;如果其他人和我在这里走的路一样,那就是我学到的......

真正的根本原因是创建了表(和约束)(使用Liquibase)以符合使用旧版本的hibernate(v3)构建的应用程序。

我们将应用程序升级到hibernate4,并且其hbm2ddl测试抱怨应用程序的注释与真实数据库中的某些constaints不同。

从hbm2ddl错误消息中,我认为导致问题的是unique后缀,但是,只需需要更改约束名称删除constaint和除了使用所需的constraintName之外,重新添加它。

所以我取得了进步,但是在liquibase ....

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

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

我不需要改变与unique(metaDataId)有关的任何事情