11

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>
    

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

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

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

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

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

4

2 回答 2

6

请参阅PostgreSQL 文档:

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

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

于 2011-06-20T10:43:29.343 回答
1

我想这取决于目标 DBMS。

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

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

于 2011-05-13T21:23:06.770 回答