MySQL - уникальные подтвержденные электронные письма - PullRequest
3 голосов
/ 07 июля 2019

У меня есть проект на Yii2, и я хочу исправить ошибку в регистрационной форме. Это моя user_profile таблица:

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

У меня есть уникальный индекс для столбца электронной почты, и когда пользователь подтвердит свой адрес электронной почты, столбец email_confirmed будет равен 1.

Теперь вот проблема: Если пользователь 1 не подтверждает свою электронную почту, никто другой не может зарегистрировать эту электронную почту.

Мне пришло в голову одно решение: удалить уникальный индекс и обработать его с помощью PHP. Но это не подходит мне на лучшее. Я хочу знать, есть ли лучшее решение с MySql?

1 Ответ

2 голосов
/ 07 июля 2019

Вы можете использовать функцию index для обработки частичных индексов (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'

дБ <> Fiddle demo

...