Vincoli univoci su colonne nullable in SQL Server 2005


12

In questo progetto a cui sto lavorando, devo impostare un determinato campo in modo che sia univoco (non un problema!) Ma se il campo è nullo voglio che il vincolo venga ignorato. In Sql Server 2008 uso l'indice filtrato come mostrato di seguito ma questo non è disponibile nelle versioni precedenti di SQL!

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

Ma non credo che questo sia disponibile in SQL Server 2005. In realtà questo post sul blog indica che esiste una soluzione alternativa che utilizza un trigger per verificare l'univocità. Qualcuno ha un esempio di questo? o forse un'alternativa?

Sfortunatamente l'aggiornamento a SQl Server 2008 non è un'opzione per questo particolare client !!

Risposte:


18

In realtà, ho dovuto fare qualcosa del genere una volta. Ha comportato la creazione di una colonna calcolata che assume il valore della colonna Unica quando non lo è NULLe il valore della chiave primaria (con qualche altra logica per rendere impossibile lo scontro con i valori sulla colonna unica) e rendere l'indice univoco attivo quella colonna. Puoi vedere un esempio di questo e il metodo di trigger qui .


7

È possibile creare una vista (dove il nome utente non è null) quindi inserire un indice univoco rispetto alla vista. Non avrai mai bisogno di usare la vista, esisterà solo per questo.

È inoltre possibile utilizzare questa tecnica per imporre l'unicità su più tabelle, dove normalmente sarebbe impossibile.


2
Le viste indicizzate non richiedono l'edizione enterprise. Tuttavia, richiedono l'utilizzo del suggerimento di query WITH (NOEXPAND) per forzare l'ottimizzatore di query della versione standard in modo da utilizzare la vista indicizzata anziché la query sottostante.
Jeremiah Peschka,

3
In questo caso, tuttavia, l'unico punto di vista è applicare il vincolo unico e questo è un approccio perfettamente valido / comune.
Martin Smith,

2
Modificato per rimuovere le informazioni errate sull'edizione Enterprise richiesta.
Meff,

@Meff grazie per aver dedicato del tempo a rispondere ai commenti qui - spero che non sarai estraneo al sito: potresti essere interessato a queste domande :)
Jack dice di provare topanswers.xyz il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.