Ich verwende SQL Server 2005. Ich möchte die Werte in einer Spalte so einschränken, dass sie eindeutig sind, während NULLS zulässig ist.
Meine aktuelle Lösung beinhaltet einen eindeutigen Index für eine Ansicht wie folgt:
CREATE VIEW vw_unq WITH SCHEMABINDING AS
SELECT Column1
FROM MyTable
WHERE Column1 IS NOT NULL
CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)
Irgendwelche besseren Ideen?
sql
sql-server
indexing
constraints
unique
Nuno G.
quelle
quelle
Antworten:
Ich bin mir ziemlich sicher, dass Sie das nicht tun können, da dies den Zweck von Unikaten verletzt.
Diese Person scheint jedoch eine anständige Arbeit zu haben: http://sqlservercodebook.blogspot.com/2008/04/multiple-null-values-in-unique-index-in.html
quelle
Mit SQL Server 2008 können Sie einen gefilterten Index erstellen: http://msdn.microsoft.com/en-us/library/cc280372.aspx . (Ich sehe, dass Simon dies als Kommentar hinzugefügt hat, dachte aber, dass es eine eigene Antwort verdient, da der Kommentar leicht übersehen wird.)
Eine weitere Option ist ein Auslöser zum Überprüfen der Eindeutigkeit. Dies kann jedoch die Leistung beeinträchtigen.
quelle
create unique index UIX on MyTable (Column1) where Column1 is not null
ANSI_NULLS
istON
. Andernfalls wird beim Einfügen von Daten eine Fehlermeldung angezeigt.Der berechnete Spaltentrick ist allgemein als "Nullbuster" bekannt. meine Notizen Kredit Steve Kass:
quelle
Genau genommen kann eine eindeutige nullfähige Spalte (oder ein Satz von Spalten) nur einmal NULL (oder ein Datensatz von NULL) sein, da der gleiche Wert (und dies schließt NULL ein) mehr als einmal offensichtlich gegen die eindeutige Einschränkung verstößt.
Dies bedeutet jedoch nicht, dass das Konzept der "eindeutigen nullbaren Spalten" gültig ist. Um es tatsächlich in einer relationalen Datenbank zu implementieren, müssen wir nur berücksichtigen, dass diese Art von Datenbanken normalisiert werden soll, um ordnungsgemäß zu funktionieren. Bei der Normalisierung werden normalerweise mehrere (Nicht-Entitäts-) zusätzliche Tabellen hinzugefügt, um Beziehungen zwischen den Entitäten herzustellen .
Lassen Sie uns ein einfaches Beispiel für nur eine "eindeutige nullfähige Spalte" erstellen. Es ist einfach, sie auf weitere solche Spalten zu erweitern.
Angenommen, wir haben die Informationen, die durch eine Tabelle wie diese dargestellt werden:
Wir können dies tun, indem wir uniqnull auseinander setzen und eine zweite Tabelle hinzufügen, um eine Beziehung zwischen uniqnull-Werten und the_entity herzustellen (anstatt uniqnull "innerhalb" der_entity zu haben):
Um einer Zeile in the_entity den Wert uniqnull zuzuordnen, müssen wir auch eine Zeile in the_relation hinzufügen.
Für Zeilen in the_entity, in denen keine eindeutigen Werte zugeordnet sind (dh für diejenigen, die NULL in the_entity_incorrect setzen würden), fügen wir einfach keine Zeile in the_relation hinzu.
Beachten Sie, dass die Werte für uniqnull für die gesamte Beziehung eindeutig sind, und beachten Sie auch, dass es für jeden Wert in der Entität höchstens einen Wert in der Beziehung geben kann, da der Primär- und der Fremdschlüssel dies erzwingen.
Wenn dann ein Wert von 5 für uniqnull mit einer the_entity-ID von 3 verknüpft werden soll, müssen wir:
Und wenn ein ID-Wert von 10 für the_entity kein eindeutiges Gegenstück hat, tun wir nur:
Um diese Informationen zu denormalisieren und die Daten zu erhalten, die eine Tabelle wie the_entity_incorrect enthalten würde, müssen wir:
Der Operator "linker äußerer Join" stellt sicher, dass alle Zeilen aus der Entität im Ergebnis angezeigt werden, und setzt NULL in die eindeutige Spalte, wenn in der Beziehung keine übereinstimmenden Spalten vorhanden sind.
Denken Sie daran, dass jeder Aufwand, der für einige Tage (oder Wochen oder Monate) beim Entwerfen einer gut normalisierten Datenbank (und der entsprechenden denormalisierenden Ansichten und Verfahren) aufgewendet wird, Ihnen Jahre (oder Jahrzehnte) an Schmerz und verschwendeten Ressourcen erspart.
quelle