Eu tenho 2 colunas col1 e col2
PERGUNTA INICIAL:
é possível fazer uma restrição para não poder adicionar o mesmo email duas vezes nestas colunas, usando apenas índices?
A pergunta foi editada para: " É possível definir uma restrição para não poder adicionar o mesmo email duas vezes nessas colunas para o mesmo registro , usando apenas índices? "
Mas a culpa é minha, não dei detalhes suficientes. Quando eu tenho uma coluna exclusiva . Não posso repetir uma entrada nesta coluna. O que eu preciso é expandir esse "único" para uma segunda coluna, para que qualquer entrada feita na primeira coluna não seja possível entrar na segunda coluna.
Eu posso fazer isso usando um programa externo consequentemente adicionando as entradas para essas duas colunas em uma matriz e sempre verificando a matriz antes de inserir algo nessas duas colunas. Mas a solução é uma piada, é sub-ótima, porque por extrapolação não precisamos mais de bancos de dados, podemos usar arrays.
Isso é possível usando apenas mysql ou preciso de "minha matriz"?
Eu acho que você pode usar
CHECK
restriçãoSim, você pode conseguir isso com a
CHECK
opção naCREATE/ALTER TABLE
instrução, mas apenas para MySQL desde v8.0.16 e MariaDB desde v10.2.1.Referência: 13.1.20.7 CHECK Constraints (MySQL Dev Documentation) e CONSTRAINT (MariaDB KB)
Exemplo
Criar a tabela
Inserir primeiros registros
A inserção falhará com a mensagem:
Verifique o conteúdo da tabela
Sim, a mesa ainda está vazia.
Inserir registros válidos
...e verifique:
...que retorna:
Atualizar segunda coluna com os mesmos dados
Devoluções:
Atualizar segunda coluna com dados diferentes
Isso parece funcionar.
Exemplo Completo
O exemplo completo pode ser encontrado em db<>fiddle .
Hoje você permite 2 emails; amanhã você permitirá 3. Isso implora por ter uma mesa separada. Tal permitirá que você use
UNIQUE
.Uma regra de design de esquema: não use várias colunas para implementar uma "matriz"; use uma tabela separada.