2016-06-08 2 views
0

У меня есть таблица с этими двух колонками, я хочу, чтобы уникальность только если columng is_deleted значения равна 0 для столбца электронной почты, так что ниже строк действительны, если [email protected] с 1 входит это позволит, где, если [email protected] с 0 входит не должно позволять , Как сделать это ограничение в mysql?Как сделать два столбца уникальными в mysql со значением 0/1 в одной таблице?

email   is_deleted 
[email protected] 1 
[email protected] 1 
[email protected] 1 
[email protected] 0 

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

[email protected] 1 
[email protected] 0 

Я работаю над мягким удалением с уникальными полями.

Благодарим за помощь.

ответ

2

Это на самом деле один из лучших вопросов, которые я видел в переполнении стека через некоторое время. По моему мнению, это само по себе невозможно, по крайней мере, не делая что-то немного творческого.

Единственный способ, которым я могу себе представить, как заставить его работать, чтобы создать дополнительное поле, которое может содержать произвольную случайную IFF is_deleted == 1, и использовать уникальный ключ от всех 3.

Таким образом, таблицы может выглядеть примерно так:

email   is_deleted null_ident 
[email protected] 1   0cc175b9c0f1b6a831c399e269772661 
[email protected] 1   92eb5ffee6ae2fec3ad71c777531578f 
[email protected] 1   4a8a08f09d37b73795649038408b5f33 
[email protected]com 0   0 

Таким образом, уникальный ключ от всех 3 из них будут блокировать только тогда, когда is_deleted является 0 и null_ident также 0 (как обработанное с помощью бизнес-логики). Если вам нужно установить is_deleted в адрес, вы также установите идентификационный ключ.


Кроме того, добавление ... в приведенном выше примере, null_ident является только MD5 хеш для общеприемлемому уникальности. В зависимости от того, что вам нужно, вам может понадобиться более сильный (или, что более вероятно, менее сильный) хэш. Хек, временная метка, вероятно, удовлетворит ваши потребности. И char (36) в индексе немного тяжелый ... но также является varchar (310) для адреса электронной почты. :)

Смежные вопросы