Duas colunas no MySQL com restrição de exclusividade entre column1 e column2
-
12-09-2019 - |
Pergunta
Vamos considerar uma tabela de usuário: Nome de usuário, email1, email2
Agora, eu quero ter certeza de que não há duas linhas desta tabela possuem qualquer endereço de e-mail comum. Qual seria a melhor maneira de garantir isso?
Ex .: Se a tabela tem linha: "Bill, Bill @ email.com, conta @ gmail.com", em seguida, tentando inserir uma linha como "Billy, billy @ yahoo.com, conta @ email.com" deve dar um erro.
Agradecemos antecipadamente, Chandresh
Solução
Infelizmente, as restrições check
não são uma característica do MySQL. Bem, eles são, mas eles são ignorados.
Use a trigger
, em vez disso:
create trigger MyValidation after insert on user for each row
begin
if (select count(*) from user where
email1 = new.email1
or email1 = new.email2
or email2 = new.email1
or email2 = new.email2) > 0 then
--I know that the delete could use this logic, but you can
--insert other instructions here.
delete from user where username = new.username
end if
end
Outras dicas
Parece que você está tentando forçar uma combinação entre 1: 1 e 1: múltiplo com o seu modelo de dados. Sua melhor aposta é a de armazenar cada combinação de usuário / e-mail separadamente. Uma linha para "Nome de usuário, email1" e outra linha para "Nome de usuário, EMAIL2". Se você tiver "username" campos relacionados com adicionais, aqueles poderia permanecer na tabela de núcleo de usuário, enquanto e-mails iria mudar para uma de duas colunas Email tabela com um índice exclusivo multi-coluna em (nome de usuário, e-mail).
Talvez você poderia usar algum tipo de procedimento armazenado, mas isso pode ser algo que você pode verificar antes de inserir seus dados.
SELECT email1, email2 FROM yourTable
WHERE email1 LIKE %@email% or email2 LIKE %@email%