如何在Liquibase中添加条件唯一约束?

时间:2019-05-05 10:43:14

标签: liquibase unique-constraint

问题:删除用户时,不会从数据库中删除关联的记录。相反,我将user.delete列设置为true。现在,我需要对user.email设置唯一的约束,但仅针对活动用户(未删除)。

我该怎么做?

databaseChangeLog:
  - changeSet:
      id: add-user-unique-constraint
      author: me
      changes:
        - addUniqueConstraint:
            columnNames: email, delete
            constraintName: unique-email-not-deleted
            tableName: users

上述幼稚的方法对(email,delete)列施加了复合约束,但是它不起作用,因为在以下流程中,用户被阻止删除和创建帐户:

  1. 使用电子邮件“ E”注册新用户
  2. 使用电子邮件“ E”删除用户
  3. 使用电子邮件“ E”重新注册新用户
  4. 使用电子邮件“ E”删除用户->错误:违反约束条件
  5. 使用电子邮件“ E”注册新用户->错误:违反约束条件

ps。数据库是H2和PostgreSQL

1 个答案:

答案 0 :(得分:1)

此功能是特定于数据库的,当前liquibase不支持此功能。

对于PostgreSQL,您可以使用直接SQL:

databaseChangeLog:
  - changeSet:
      id: add-user-unique-constraint
      author: me
      changes:
        - sql:
            "sql": "CREATE UNIQUE INDEX user_email_idx ON user (email) WHERE delete = 'false'"

但这在H2中不能生效。

H2的可能选项:

  • 如果用于测试,则可以使用testcontainers技术迁移到PostgreSQL(但是您的构建环境将取决于docker

  • 具有PostgreSQLH2的自定义变更集-您可以使用preconditions