如何在数据库中强制执行仅适用于特定条件的UNIQUE KEY?对于一个特定的示例,该表由几个列组成,这些列只有在设置另一个BIT列时才必须保持唯一。简单地将BIT列添加到密钥是不够的,因为可能存在相同配置的多个退役设备。这似乎是一个非常普遍的用例,如果没有内置功能,肯定有几种解决方案吗?
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时禁止它们。
null
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在唯一索引中重复。
NULL
2条答案
按热度按时间2lpgd9681#
您正在查找部分唯一密钥。MySQL中的解决方案因您的版本而异。
在MySQL 8.0中:
这利用了在检查唯一约束时忽略
null
值的事实。因此,当is_active为0时,上面允许在device_id / location_id上重复,而当is_active为1时禁止它们。2ledvvac2#
MySQL现在支持计算列。所以,你可以使用它:
这使用了MySQL的特性,它允许
NULL
在唯一索引中重复。