在Liquibase中添加复合唯一约束

Ale*_*lec 19 unique-constraint liquibase

我正在创建一个包含3列的链接表; id,product_id,tournament_id.

将uniqueConstraint添加到"id"列是微不足道的,但我想确保任何一对(product_id,tournament_id)都是唯一的.

Liquibase.org上的例子显示

<changeSet author="liquibase-docs" id="addUniqueConstraint-example">
<addUniqueConstraint catalogName="cat"
        columnNames="id, name"
        constraintName="const_name"
        deferrable="true"
        disabled="true"
        initiallyDeferred="true"
        schemaName="public"
        tableName="person"
        tablespace="A String"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

但是有可能在一个<createTable>街区内完成吗?

另外,只是为了确认; 这会在两列上创建复合唯一约束,还是会创建两个独立的唯一约束?

小智 25

您可以阅读 liquibase手册,也可以在这里找到类似的问题

在你的情况下,它应该是:

<changeSet author="liquibase-docs" id="addUniqueConstraint-example">
<addUniqueConstraint
        columnNames="id, product_id, tournament_id"
        constraintName="your_constraint_name"
        tableName="person"
        />
</changeSet>
Run Code Online (Sandbox Code Playgroud)


Ste*_*nie 16

我很确定:

  1. 无法在createTable标记本身内执行此操作,但您可以在创建表时使用相同的更改集中执行此操作.
  2. 确实在两列上创建了一个复合唯一约束.您可以检查的一种方法是使用命令运行liquibase以生成用于更新的SQL,而不是运行update命令并检查它对您的数据库的作用.在命令行上,而不是运行,liquibase update你会运行liquibase updateSQL.


小智 8

createTable如果像我这样的人多年后仍然问自己这个问题:(到目前为止)如果您为约束提供相同的名称,则可以在标签本身内执行此操作:

<changeSet id="composite-unique-example" author="composite-unique-example">
  <createTable tableName="example">
    <column name="foo" type="bigint">
      <constraints unique="true" uniqueConstraintName="foo-bar_unique"/>
    </column>
    <column name="bar" type="bigint">
      <constraints unique="true" uniqueConstraintName="foo-bar_unique"/>
    </column>
  </createTable>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

运行 Liquibase4.5.0和 MySQL 5.7

mysql> insert into example (foo, bar) values (1, 2), (2, 1), (1, 3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from example;
+------+------+
| foo  | bar  |
+------+------+
|    1 |    2 |
|    1 |    3 |
|    2 |    1 |
+------+------+
3 rows in set (0.00 sec)

mysql> insert into example (foo, bar) values (1, 2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 'foo-bar_unique'
Run Code Online (Sandbox Code Playgroud)