Liquibase有两种方法可以将列定义为唯一:
创建表格时,使用列上的<constraints>
:
<createTable tableName="my_table">
<column name="my_column">
<constraints unique="true"
uniqueConstraintName="my_table_my_column_uk">
</column>
</createTable>
创建表格后,使用<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 changelog。如果模型指示列是唯一的,则生成脚本会创建BOTH声明。我正在清理生成的结果,并希望删除其中一个声明,并想知道这是否合适。
答案 0 :(得分:3)
注意:添加的首选方式 对表的唯一约束是ALTER 表...添加约束。指某东西的用途 索引以强制执行唯一约束 可以被认为是一种实施 不应该访问的细节 直。然而,应该是 意识到没有必要手动 在唯一列上创建索引; 这样做只会复制 自动创建索引。
因此,一个独特的约束是一个在PostgreSQL中实现的具有唯一索引的概念。
答案 1 :(得分:1)
我想这取决于目标DBMS。
在PostgreSQL,Oracle和DB2中,唯一索引和唯一约束之间存在差异。
唯一约束可以是外键约束的目标,但唯一索引不能。不知道这与MySQL是否相同。