Rob*_*ska 8 sql database changelog database-migration liquibase
Liquibase有两种方法可以将列定义为唯一:
创建表时,<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)创建表后,使用<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声明.我正在清理生成的结果,并希望删除其中一个声明,并想知道这是否合适.
注意:向表添加唯一约束的首选方法是 ALTER TABLE ... ADD CONSTRAINT。使用索引来强制唯一约束可以被视为不应直接访问的实现细节。但是,应该注意没有必要在唯一的列上手动创建索引;这样做只会复制自动创建的索引。
所以唯一约束是一个概念,它是用唯一索引实现的(在 PostgreSQL 中)。
小智 2
我想这取决于目标 DBMS。
在 PostgreSQL、Oracle 和 DB2 中,唯一索引和唯一约束之间存在差异。
唯一约束可以是外键约束的目标,但唯一索引不能。不知道MySQL是不是也是这样。