Mysql组合密钥顺序相关性

Mysql组合密钥顺序相关性,mysql,database,key,composite,Mysql,Database,Key,Composite,我有一张mySql表: create table associations (email1 varchar(30), email2 varchar(30), primary key(email1, email2)); 现在在这个表中,如果我插入两行,如下所示: 插入关联值('a@abc.com','b@abc.com) 这些在数据库中是可以接受的。我想做的是它们不应该被数据库接受,因为我只对键的组合感兴趣,而不是键的顺序 mysql(或任何其他数据库)中是否有任何内置功能/关键字/hack允

我有一张mySql表:

create table associations
(email1 varchar(30), 
email2 varchar(30),
primary key(email1, email2));
现在在这个表中,如果我插入两行,如下所示:

插入关联值('a@abc.com','b@abc.com)

这些在数据库中是可以接受的。我想做的是它们不应该被数据库接受,因为我只对键的组合感兴趣,而不是键的顺序


mysql(或任何其他数据库)中是否有任何内置功能/关键字/hack允许我这样做?

在支持检查约束的RDBMS中,您可以强制这两个条目以特定顺序出现。*这确保不会发生您描述的重复,因为两个订单中的一个将被拒绝。不幸的是,MySQL没有提供检查约束,尽管已被接受的答案建议了一种使用触发器实现类似结果的方法


*这是假设您对列数据类型有一个总的顺序,在本例中您是这样做的。

这对我有效,我提出了以下触发器:

mysql> create trigger insert_check_associations before insert on associations
-> for each row
-> begin
-> if new.email1>new.email2 then
-> set @a = new.email2;
-> set new.email2 = new.email1;
-> set new.email1 = @a;
-> end if;
-> end;//
查询正常,0行受影响(0.07秒)


此触发器按递增顺序交换两个值。

不能作为复合主键,但可以创建函数索引。但我不认为MySQL支持这一点。另一个解决方案是添加约束
email1
mysql> create trigger insert_check_associations before insert on associations
-> for each row
-> begin
-> if new.email1>new.email2 then
-> set @a = new.email2;
-> set new.email2 = new.email1;
-> set new.email1 = @a;
-> end if;
-> end;//