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

Rob*_*ska 8 sql database changelog database-migration liquibase

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

  1. 创建表时,<constraints>在列上使用:

    <createTable tableName="my_table">
        <column name="my_column">
            <constraints unique="true"
                         uniqueConstraintName="my_table_my_column_uk">
        </column>
    </createTable>
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

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

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

...
UNIQUE_KEY `my_table_my_column_uk` (`my_column`)
...
Run Code Online (Sandbox Code Playgroud)

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

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

Jan*_*ing 6

请参阅PostgreSQL 文档:

注意:向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制唯一约束可以被视为不应直接访问的实现细节。但是,应该注意没有必要在唯一的列上手动创建索引;这样做只会复制自动创建的索引。

所以唯一约束是一个概念,它是用唯一索引实现的(在 PostgreSQL 中)。


小智 2

我想这取决于目标 DBMS。

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

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