仅在活动设备 mySQL

问题描述 投票:0回答:2

如何在仅适用于特定条件的数据库中实施唯一密钥?对于特定示例,该表由多个列组成,只有在设置另一个 BIT 列时,这些列才必须保持唯一。

简单地将 BIT 列添加到密钥中是不够的,因为可能有多个相同配置的退役设备。

这似乎是一个普遍的用例,如果没有内置功能,肯定有几种解决方法?

sql mysql create-table alter-table
2个回答
2
投票

您正在寻找部分唯一密钥。 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 时禁止重复。


2
投票

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
重复。

© www.soinside.com 2019 - 2024. All rights reserved.