【问题标题】:Unique constraint by 2 columns where one has a specific value2 列的唯一约束,其中一列具有特定值
【发布时间】:2021-10-07 21:28:15
【问题描述】:

UNIQUE CONSTRAINT 有问题。

我需要基于两列添加约束,其中一列需要具有特定值。

例如,假设我有一个users 表,其中当然包含用户,主键只是一个递增的整数。

我有一个configurations 表,除了配置列之外还有两列:user_idusers 表的外键)和main,它采用 0/1 值。

逻辑如下:一个用户可以有多个配置,一个配置属于一个用户——如表所示。 但是,我想限制它,使一个用户只能拥有一个主要配置(main = 1)并考虑唯一性。

我试过了

ALTER TABLE `configurations` ADD UNIQUE `unique_main_user`(`user_id`, `main`);

但这会将我限制为一种主要配置和一种非主要配置,这很混乱。

是否有可能添加 WHERE 语句或任何其他解决方案可以让我达到这种效果?

【问题讨论】:

    标签: mysql unique-constraint


    【解决方案1】:

    由于MySQL allows multiple NULLs in a column with a unique constraint,您可以在约束中添加一个 case 表达式,以便为主配置以外的任何内容返回 null,这将允许非主配置重复,但只有一个主配置:

    CREATE TABLE Configuration 
    (
        ConfigurationID  INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
        UserID INT NOT NULL,
        Main BIT NOT NULL,
        UNIQUE (UserID, (CASE WHEN Main = 1 THEN 1 END))
     );
    

    Example on db<>fiddle

    【讨论】:

    • 解决问题的一个非常有趣的方法。附加柱的副作用仍然存在问题。不过挺好的。
    • 我刚刚意识到不需要额外的列,您可以将 case 表达式直接放在约束定义中(我已经更新了答案以显示这一点,因为它更清晰)跨度>
    • 太棒了。没想到你可以在 DDL 语句中使用 CASE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多