我在MySQL中有以下表格列。
id
user_primary_email
user_secondary_email
我希望将user_primary_email
和user_secondary_email
列组合成唯一,我可以使用UNIQUE KEY unique_key_name (user_primary_email, user_secondary_email)
上面添加的唯一键约束将帮助我实现以下场景,或者只是通过向单个列本身添加唯一键。
user_primary_email = 'xyz@gmail.com' AND user_secondary_email = 'pqr@gmail.com'
user_primary_email = 'xyz@gmail.com' AND user_secondary_email = 'pqr@gmail.com' //This will not be allowed to enter due to unique key constraint
现在我遇到的问题是不应该允许以下面提到的相反方式添加相同的组合。
user_primary_email = 'pqr@gmail.com' AND user_secondary_email = 'xyz@gmail.com' //This should not be allowed to add since already same email id combination added once
id | user_primary_email | user_secondary_email
-------------------------------------------------------
1 | xyz@gmail.com | pqr@gmail.com
-------------------------------------------------------
2 | pqr@gmail.com | xyz@gmail.com
-------------------------------------------------------
在插入行ID 2 的上述情况下,它应该抛出错误,因为电子邮件ID组合已经在行ID 1 中使用。
任何帮助都会很棒。
答案 0 :(得分:5)
任何MariaDB:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`user_primary_email` varchar(64) DEFAULT NULL,
`user_secondary_email` varchar(64) DEFAULT NULL,
`mycheck` varchar(128) AS (IF(user_primary_email<user_secondary_email,CONCAT(user_primary_email,user_secondary_email),CONCAT(user_secondary_email,user_primary_email))) PERSISTENT,
PRIMARY KEY (`id`),
UNIQUE KEY `mycheck` (`mycheck`)
);
MariaDB [test]> insert into t values (1,'a','b',null);
Query OK, 1 row affected (0.03 sec)
MariaDB [test]> insert into t values (2,'b','a',null);
ERROR 1062 (23000): Duplicate entry 'ab' for key 'mycheck'
答案 1 :(得分:3)
没有直接的支持,但您可以使用变通方法来创建双向密钥:您需要在两列的订购版本上使用唯一密钥。
幸运的是,你可以很容易地做到这一点。 MySQL 5.7.6+支持为它们生成列和唯一索引,您可以使用它们来订购两个值并强制实现唯一性。
create table testBiDirKey (
a varchar(100),
b varchar(100),
a_ordered varchar(100) as (least(a, b)) STORED,
b_ordered varchar(100) as (greatest(a, b)) STORED,
unique key unqBi_test_ab (a_ordered, b_ordered)
);
insert into testBiDirKey(a,b) values('a', 'b');
insert into testBiDirKey(a,b) values('b', 'a');
Error Code: 1062. Duplicate entry 'a-b' for key 'unqBi_test_ab'
这会将null
完全视为您当前的正常唯一键,所以
insert into testBiDirKey(a,b) values('a', null);
insert into testBiDirKey(a,b) values('a', null);
insert into testBiDirKey(a,b) values(null, 'a');
都是允许的。如果需要,您可以添加coalesce(x,'')
以仅允许一个空值(null
或''
)。如果您在添加它们之前验证了它们的值(例如,如果它们不包含,
),您可以将这两列合并为一列,与,
连接 - 尽管效果不大除了只增加一列之外。
对于5.7.8 +,您不再需要STORED
关键字才能在索引中使用这些列。如果值存储(使用磁盘空间)或在需要时计算(默认),则该关键字会生效。
在MySQL 5.7.6之前,您可以使用触发器(在update
和insert
上)使用这些值更新两列,同样的逻辑适用,它只是一个更多的代码。