Unikalne ograniczenia dotyczące zerowalnych kolumn w SQL Server 2005


12

W tym jednym projekcie, nad którym pracuję, muszę ustawić określone pole, aby było unikalne (nie jest to problem!), Ale jeśli pole ma wartość zerową, chcę, aby ograniczenie zostało zignorowane. W Sql Server 2008 używam filtrowanego indeksu, jak pokazano poniżej, ale nie jest to dostępne we wcześniejszych wersjach SQL!

CREATE UNIQUE NONCLUSTERED INDEX User_UserName_IUC
ON [User] (pinNr)
WHERE UserName IS NOT NULL

Ale nie sądzę, że jest to dostępne w SQL Server 2005. W rzeczywistości ten post na blogu wskazuje, że istnieje obejście polegające na użyciu wyzwalacza do sprawdzenia wyjątkowości. Czy ktoś ma na to przykład? a może alternatywa?

Niestety uaktualnienie do SQl Server 2008 nie jest opcją dla tego konkretnego klienta !!

Odpowiedzi:


18

Właściwie to kiedyś musiałem zrobić coś takiego. Polegało to na utworzeniu kolumny obliczeniowej, która przyjmuje wartość kolumny Unique, gdy nie jest, NULLoraz wartości klucza podstawowego (z pewną inną logiką uniemożliwiającą zderzenie się z wartościami w kolumnie unikatowej) i utworzenia niepowtarzalnego indeksu na ta kolumna. Możesz zobaczyć przykład tego i metodę wyzwalania tutaj .


7

Możesz utworzyć widok (gdzie nazwa użytkownika nie ma wartości null), a następnie umieścić unikalny indeks względem widoku. Widok nigdy nie będzie potrzebny, po prostu będzie istniał w tym celu.

Możesz także użyć tej techniki do wymuszenia unikalności w kilku tabelach, gdzie normalnie byłoby to niemożliwe.


2
Widoki indeksowane nie wymagają edycji korporacyjnej. Wymagają one jednak użycia podpowiedzi Z zapytaniem Z (NOEXPAND), aby zmusić optymalizator zapytań do edycji standardowej do użycia widoku indeksowanego zamiast zapytania bazowego.
Jeremiah Peschka

3
W tym przypadku jednak jedynym punktem widzenia jest wymuszenie wyjątkowego ograniczenia i jest to całkowicie poprawne / powszechne podejście.
Martin Smith

2
Edytowane w celu usunięcia niepoprawnych informacji o wymaganiu edycji Enterprise.
Meff

@Meff dziękuję za poświęcenie czasu na odpowiedź na komentarze tutaj - mam nadzieję, że nie będziesz obcy na stronie: możesz być zainteresowany tymi pytaniami :)
Jack mówi, spróbuj wypróbować topanswers.xyz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.