Mysql 无列顺序的唯一键约束

Mysql 无列顺序的唯一键约束,mysql,sql,database,Mysql,Sql,Database,我有一张桌子 药物相互作用(药物1号、药物2号) 我想知道是否有可能在不考虑值顺序的情况下拥有唯一的drug1\u id和drug2\u id对。例如,如果表中已经存在(1,2) 然后不允许插入(2,1)。这在MySQL中很难做到。在许多数据库中,您可以使用检查约束来确保药物处于有序状态: check (drug1_id < drug2_Id) 检查(药物1\u id

我有一张桌子 药物相互作用(药物1号、药物2号)

我想知道是否有可能在不考虑值顺序的情况下拥有唯一的drug1\u id和drug2\u id对。例如,如果表中已经存在(1,2)
然后不允许插入(2,1)。

这在MySQL中很难做到。在许多数据库中,您可以使用
检查
约束来确保药物处于有序状态:

check (drug1_id < drug2_Id)
检查(药物1\u id<药物2\u id)
然而,MySQL实际上并没有强制执行这些约束


执行此操作的唯一方法是在表上使用触发器。

执行此操作的一种方法是创建两个计算列,在每个记录上存储最小和最大的
药物id
,并对其施加唯一约束

考虑:

create table drug_interaction(
    drug1_id int ,
    drug2_id int,
    drug_least    int as (least(drug1_id, drug2_id))    stored,
    drug_greatest int as (greatest(drug1_id, drug2_id)) stored,
    unique key unique_drugs (drug_least, drug_greatest)
)

insert into drug_interaction(drug1_id, drug2_id) values(1, 2)
-- ok

insert into drug_interaction(drug1_id, drug2_id) values(2, 1)
-- error: Duplicate entry '1-2' for key 'unique_drugs'

实际上,MySQL 8+应该强制执行您的约束。在我的理解中,问题更多的是如何保证元组(包括组合)的唯一性,而不是排序(而强制排序肯定是一个解决方案)。