使用Liquibase,使用唯一的<createindex>和使用带有唯一约束的<column>之间有区别吗?</column> </createindex>

时间:2011-05-13 17:36:39

标签: sql database database-migration liquibase changelog

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

  1. 创建表格时,使用列上的<constraints>

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

    <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>
    
  3. 这两种单列唯一键的方法有什么区别吗?

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

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

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

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

2 个答案:

答案 0 :(得分:3)

请参阅PostgreSQL Documentation:

  

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

因此,一个独特的约束是一个在PostgreSQL中实现的具有唯一索引的概念。

答案 1 :(得分:1)

我想这取决于目标DBMS。

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

唯一约束可以是外键约束的目标,但唯一索引不能。不知道这与MySQL是否相同。