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

naX*_*aXa 5 unique-constraint liquibase

问题:删除用户时,相关记录不会从数据库中删除。相反,我将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
Run Code Online (Sandbox Code Playgroud)

上面的简单方法对(电子邮件、删除)列施加了复合约束,但它不起作用,因为在以下流程中用户被阻止删除和创建帐户:

  1. 使用电子邮件“E”注册新用户
  2. 删除电子邮件地址为“E”的用户
  3. 使用电子邮件“E”再次注册新用户
  4. 删除电子邮件为“E”的用户 -> 错误:违反约束
  5. 使用电子邮件“E”注册新用户 -> 错误:违反约束

附:数据库是H2和PostgreSQL

小智 5

此功能是 DB 特定的,目前 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'"
Run Code Online (Sandbox Code Playgroud)

但这H2.​

可能的选项H2

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

  • 有自定义变更集PostgreSQL-H2您可以使用preconditions