Eu tenho uma mesa e, de alguma forma, a mesma pessoa entrou Person
duas vezes na minha mesa. No momento, a chave primária é apenas uma numeração automática, mas existem outros dois campos que quero forçar a serem únicos.
Por exemplo, os campos são:
ID
Name
Active
PersonNumber
Quero apenas 1 registro com um PersonNumber exclusivo e Active = 1.
(Portanto, a combinação dos dois campos precisa ser única)
Qual é a melhor maneira em uma tabela existente no SQL Server? Posso fazê-lo, se alguém fizer uma inserção com o mesmo valor que um valor existente, ele falhará, para que não precise me preocupar com isso no código do meu aplicativo.
sql
sql-server
leora
fonte
fonte
Respostas:
Depois de remover suas duplicatas:
ou
Obviamente, pode ser melhor verificar essa violação primeiro, antes de deixar o SQL Server tentar inserir a linha e retornar uma exceção (as exceções são caras).
http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling
http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/
Se você deseja impedir que as exceções sejam transmitidas para o aplicativo, sem fazer alterações no aplicativo, você pode usar um
INSTEAD OF
gatilho:Mas se você não informar ao usuário que ele não executou a inserção, eles se perguntarão por que os dados não estão lá e nenhuma exceção foi relatada.
EDITAR aqui é um exemplo que faz exatamente o que você está pedindo, mesmo usando os mesmos nomes da sua pergunta, e a prova. Você deve experimentá-lo antes de assumir que as idéias acima tratam apenas uma coluna ou outra em oposição à combinação ...
Dados na tabela depois de tudo isso:
Mensagem de erro na última inserção:
fonte
Isso também pode ser feito na GUI:
fonte
new Index
não é clicável, está desabilitado :(No meu caso, eu precisava permitir muitos inativos e apenas uma combinação de duas chaves ativas, como esta:
Isso parece funcionar:
Aqui estão meus casos de teste:
fonte
E se você tiver muitas consultas de inserção, mas não desejar gerar uma mensagem de ERRO sempre, poderá fazê-lo:
fonte