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

问题描述 投票:2回答:1

问题:删除用户时,不会从数据库中删除关联的记录。相反,我将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

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

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

ps。数据库是H2和PostgreSQL

liquibase unique-constraint
1个回答
0
投票

此功能是特定于数据库的,当前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'"

但是这将NOTH2中起作用。

H2的可能选项:

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

  • 具有dockerPostgreSQL的自定义更改集-您可以使用H2

© www.soinside.com 2019 - 2024. All rights reserved.