仅在活动设备上强制使用UNIQUE KEY mySQL

zqry0prt  于 2023-05-21  发布在  Mysql
关注(0)|答案(2)|浏览(123)

如何在数据库中强制执行仅适用于特定条件的UNIQUE KEY?对于一个特定的示例,该表由几个列组成,这些列只有在设置另一个BIT列时才必须保持唯一。
简单地将BIT列添加到密钥是不够的,因为可能存在相同配置的多个退役设备。
这似乎是一个非常普遍的用例,如果没有内置功能,肯定有几种解决方案吗?

2lpgd968

2lpgd9681#

您正在查找部分唯一密钥。MySQL中的解决方案因您的版本而异。
在MySQL 8.0中:

create table mydevices (
    id int primary key,
    device_id int,
    location_id,
    is_active tinyint(1),
    unique key (device_id, location_id, nullif(is_active, 0))
);

这利用了在检查唯一约束时忽略null值的事实。因此,当is_active为0时,上面允许在device_id / location_id上重复,而当is_active为1时禁止它们。

2ledvvac

2ledvvac2#

MySQL现在支持计算列。所以,你可以使用它:

alter table t
    add unq_column as (case when bitcol = 1 then othercol end);

create unique index unq_t_bit_othercol on t(unq_column);

这使用了MySQL的特性,它允许NULL在唯一索引中重复。

相关问题