如何在仅适用于特定条件的数据库中实施唯一密钥?对于特定示例,该表由多个列组成,只有在设置另一个 BIT 列时,这些列才必须保持唯一。
简单地将 BIT 列添加到密钥中是不够的,因为可能有多个相同配置的退役设备。
这似乎是一个普遍的用例,如果没有内置功能,肯定有几种解决方法?
您正在寻找部分唯一密钥。 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 时禁止重复。
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
重复。