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

Foi útil?

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%
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top