MySQL-唯一确认的电子邮件

时间:2019-07-07 05:51:34

标签: mysql mysql-5.7

我在Yii2上有一个项目,我想修复注册表格中的一个错误。 这是我的user_profile表:

id | email | email_confirmed
____________________________
1  | a@b.c | 0

我在电子邮件列上有一个唯一索引,当用户确认其电子邮件地址时,email_confirmed列将为1。

现在是问题所在: 如果用户1未确认他/她的电子邮件,则没有其他人可以注册该电子邮件。

我想到的一个解决方案是删除唯一索引并通过PHP处理它。但这并不适合我。我想知道MySql是否有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

您可以使用函数索引来处理部分索引(MySQL 8.0.13及更高版本):

CREATE TABLE t
AS    SELECT 1 id, 'a@b.c' email,  0 AS email_confirmed
UNION SELECT 2 id, 'a@b.c' email,  1 AS email_confirmed;

和索引:

CREATE UNIQUE INDEX uq_t ON t((CASE WHEN email_confirmed = 1 THEN email END));

尝试插入另一封已确认的电子邮件:

INSERT INTO t(id, email, email_confirmed) VALUES (3, 'a@b.c', 1);
-- Duplicate entry 'a@b.c' for key 'uq_t'

db<>fiddle demo