2 列的唯一约束,其中一列具有特定值

Unique constraint by 2 columns where one has a specific value

我对 UNIQUE CONSTRAINT 有疑问。

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

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

我有一个 configurations table 除了配置列外还有两列:user_idusers table 的外键) 和 main 取 0/1 值。

逻辑如下:一个用户可以有多个配置,一个配置属于一个用户——如table所示。 不过,我想限制一下,让一个用户只能有一个主配置(main = 1),想过unique。

我试过了

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

但这将限制我只能使用一种主配置和一种非主配置,这很混乱。

是否可以添加 WHERE 语句或任何其他解决方案来实现此效果?

因为 MySQL allows multiple NULLs in a column with a unique constraint 您可以将 case 表达式添加到 return 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