【问题标题】:liquibase - how to alter table to make a existing constraint unique?liquibase - 如何更改表以使现有约束唯一?
【发布时间】:2016-09-20 05:21:24
【问题描述】:

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

【问题讨论】:

  • 我不确定我是否理解您的要求 - 但需要考虑两件事:让 liquibase 使用 updateSQL 而不是 update 运行。它将生成 SQL 语句,而不是直接在数据库上运行它们。通过这种方式,您可以检查 liquibase 真正生成的内容。第二件事是:我也在使用 liquibase 和 hibernate,并且约束名称看起来很像 hibernate 生成的。那么你确定你的表真的是由 liquibase 生成的吗?

标签: hibernate jpa liquibase hbm2ddl


【解决方案1】:

这是一个XY problem;万一其他人走上和我一样的路,这就是我学到的……

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

我们将应用升级到 hibernate4,它的 hbm2ddl 测试抱怨应用的注释与真实数据库中的一些约束不同。

从 hbm2ddl 错误消息中,我认为是 unique 后缀导致了问题,然而,这只是 需要更改的约束名称删除约束并重新完全按照原样添加它,但使用所需的约束名称。

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

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

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

而且我不需要更改与唯一 (metaDataId) 相关的任何内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多