【问题标题】:With Liquibase, is there a difference between using a unique <createIndex> and using <column> with a unique constraint?使用 Liquibase,使用唯一的 <createIndex> 和使用具有唯一约束的 <column> 之间有区别吗?
【发布时间】:2011-08-25 03:19:26
【问题描述】:

Liquibase 有两种方法可以将列定义为唯一:

  1. 创建表时,在列上使用&lt;constraints&gt;:

    <createTable tableName="my_table">
        <column name="my_column">
            <constraints unique="true"
                         uniqueConstraintName="my_table_my_column_uk">
        </column>
    </createTable>
    
  2. 创建表后,使用&lt;createIndex&gt;:

    <createTable tableName="my_table">
        <column name="my_column"/>
    </createTable>
    <createIndex tableName="my_table" unique="true"
                 indexName="my_table_my_column_uk">
        <column name="my_column"/>
    </createIndex>
    

这两种方法对于单列唯一键有什么区别吗?

根据我自己对 MySQL 的观察,似乎没有区别。两个声明(上面)产生相同的SHOW CREATE TABLE 结果:

...
UNIQUE_KEY `my_table_my_column_uk` (`my_column`)
...

但是,这是否适用于所有数据库实现,或者&lt;createIndex unique="true"&gt; 是否为不同的数据库从&lt;constraint unique="true"/&gt; 生成不同的架构输出?

背景:我有一个脚本,它直接从代码中的关系模型构建了 liquibase 更改日志。如果模型指示列是唯一的,则生成脚本会创建 BOTH 声明。我正在清理生成的结果并想删除其中一个声明,并想知道这是否合适。

【问题讨论】:

    标签: sql database database-migration liquibase changelog


    【解决方案1】:

    见PostgreSQL Documentation:

    注意:添加 表的唯一约束是 ALTER 表...添加约束。指某东西的用途 强制唯一约束的索引 可以被认为是一种实现 不应访问的细节 直接地。然而,一个应该是 意识到没有必要手动 在唯一列上创建索引; 这样做只会复制 自动创建的索引。

    因此,唯一约束是(在 PostgreSQL 中)使用唯一索引实现的概念。

    【讨论】:

      【解决方案2】:

      我猜这取决于目标 DBMS。

      在 PostgreSQL、Oracle 和 DB2 中,唯一索引和唯一约束之间存在差异。

      唯一约束可以是外键约束的目标,但唯一索引不能。不知道 MySQL 是不是也这样。

      【讨论】:

      • 我不相信我会设置任何引用唯一键的外键,所以这应该不是问题。但是感谢您提供的信息;我将在不同的数据库上做一些额外的搜索 w.r.t 唯一键/约束,看看我的更改是否会出现问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多