Mam stół i jakoś ta sama osoba Person
dwukrotnie weszła do mojego stołu. W tej chwili klucz podstawowy to tylko autonumerowanie, ale istnieją dwa inne pola, które chcę wymusić, aby były unikalne.
Na przykład pola to:
ID
Name
Active
PersonNumber
Chcę tylko 1 rekord z unikatowym PersonNumber i Active = 1
(więc połączenie tych dwóch pól musi być unikalne)
Jaki jest najlepszy sposób na istniejącą tabelę na serwerze SQL, mogę to zrobić, więc jeśli ktoś inny wykona wstawkę o tej samej wartości co istniejąca wartość, nie powiedzie się, więc nie muszę się tym martwić w kodzie mojej aplikacji.
sql
sql-server
leora
źródło
źródło
Odpowiedzi:
Po usunięciu swoich duplikatów:
lub
Oczywiście często lepiej jest najpierw sprawdzić to naruszenie, a dopiero potem pozwolić SQL Server na wstawienie wiersza i zwrócenie wyjątku (wyjątki są kosztowne).
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/
Jeśli chcesz zapobiec propagowaniu wyjątków do aplikacji bez wprowadzania zmian w aplikacji, możesz użyć
INSTEAD OF
wyzwalacza:Ale jeśli nie powiesz użytkownikowi, że nie wykonał wstawiania, będą się zastanawiać, dlaczego nie ma danych i nie zgłoszono żadnego wyjątku.
EDYTUJ to przykład, który robi dokładnie to, o co prosisz, nawet używając tych samych nazw, co twoje pytanie, i udowadnia to. Powinieneś to wypróbować przed założeniem, że powyższe pomysły traktują tylko jedną lub drugą kolumnę, w przeciwieństwie do kombinacji ...
Dane w tabeli po tym wszystkim:
Komunikat o błędzie na ostatniej wkładce:
źródło
Można to również zrobić w GUI:
źródło
new Index
nie jest klikalny, jest wyłączony :(W moim przypadku musiałem zezwolić na wiele nieaktywnych i tylko jedną kombinację dwóch kluczy aktywnych, na przykład:
To wydaje się działać:
Oto moje przypadki testowe:
źródło
A jeśli masz dużo zapytań, ale nie chcesz za każdym razem otrzymywać komunikatu ERROR, możesz to zrobić:
źródło