MySQL - 唯一确认的电子邮件

标签 mysql mysql-5.7

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

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

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

问题来了: 如果用户 1 不确认他/她的电子邮件,则没有其他人可以注册该电子邮件。

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

最佳答案

您可以使用函数索引来处理部分索引(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

关于MySQL - 唯一确认的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56919696/

相关文章:

mysql - 如何在mysql中选择除group by之外的其他列

php - 最近采访 Q - 为多个用户操作页面上的对象?

php - 防止在 PHP 中的高级 MySQL 存储过程语句中注入(inject)

php - 当某些数据丢失时,mysql $result 是否设置?

mysql - 在更改 MySQL 中的变量 default_password_lifetime 后,我们是否需要运行刷新权限?

mysql - 我对同一个表有两个查询,这些表具有我要加入的不同分组

MySQL : automatically update a column in another table with foreign key, 触发器还是什么?

mysql - ORDER BY 究竟是如何工作的?

mysql - MYSQL Full GROUP BY 的解决方法

mysql - 将 JSON 文件导入 MySQL 5.7