Zurück zu: SQL Server Tutorial für Anfänger und Profis
SQL Server Unique Index
In diesem Artikel werde ich SQL Server Unique Index mit Beispielen besprechen. Wenn wir einen SQL Server-Index mit der Option Unique erstellen, wird er SQL Server Unique Index genannt. Dann lässt die Spalte(n), auf der/denen der Unique-Index erstellt wird, keine doppelten Werte zu, d.h. er funktioniert als Unique Constraint.
Der SQL Server Unique-Index gibt Garantien, dass die Spalte, auf der der Index erstellt wird, keine doppelten Werte akzeptiert. Bitte lesen Sie die folgenden Artikel, die für das Verständnis des SQL Server Unique Index notwendig sind.
SQL Server Indizes
Clustered Index in SQL Server
Non-Clustered Indexes in SQL Server
Lassen Sie uns den SQL Server Unique Index anhand eines Beispiels verstehen.
Wir werden die folgende Tabelle Mitarbeiter verwenden. Verwenden Sie das folgende SQL-Skript, um die Tabelle „Mitarbeiter“ zu erstellen und mit Testdaten zu füllen.
Da wir die Spalte Id als Primärschlüsselspalte in der Tabelle „Mitarbeiter“ markiert haben, wird standardmäßig ein eindeutiger geclusterter Index in der Spalte Id mit Id als Indexschlüssel erstellt. Um zu prüfen, ob ein eindeutiger geclusterter Index erstellt wurde oder nicht, verwenden Sie die System-Stored-Procedure sp_helpindex wie unten gezeigt.
sp_helpindex Mitarbeiter
Aus dem obigen Diagramm geht klar hervor, dass ein eindeutiger geclusterter Index in der Spalte Id der Tabelle Mitarbeiter erstellt wird. Da wir einen UNIQUE CLUSTERED INDEX auf die Spalte „Id“ der Tabelle „Employees“ haben, führt jeder Versuch, die Schlüsselwerte, d. h. die Werte der Spalte „Id“ der Tabelle „Employee“ zu duplizieren, zu einem Fehler.
Lassen Sie uns versuchen, zwei Datensätze mit denselben Id-Werten einzufügen, wie unten gezeigt.
INSERT INTO Mitarbeiter VALUES(1,’Pranaya‘, ‚Rout‘,4500,’Männlich‘,’Mumbai‘)
INSERT INTO Mitarbeiter VALUES(1,’Anurag‘, ‚Mohanty‘,2500,’Männlich‘,’Delhi‘)
Wenn wir versuchen, die beiden obigen Datensätze einzufügen, erhalten wir die unten stehende Fehlermeldung, die sicherstellt, dass wir keine doppelten Schlüsselwerte einfügen können, wenn es einen eindeutigen Index in SQL Server gibt.
‚Violation of PRIMARY KEY constraint ‚PK__Employee__3214EC0775FF9526‘. Es kann kein doppelter Schlüssel in das Objekt ‚dbo.Employees‘ eingefügt werden. Der Wert des doppelten Schlüssels ist (1)‘.
Lassen Sie uns nun versuchen, den Unique-Clustered-Index auf der Spalte Id zu löschen, indem wir den DROP-Befehl wie unten gezeigt verwenden.
DROP INDEX Employees.PK__Employee__3214EC0775FF9526
Wenn wir versuchen, den obigen DROP INDEX-Befehl auszuführen, erhalten wir die folgende Fehlermeldung
‚Ein expliziter DROP INDEX ist für den Index ‚Employees.PK__Employee__3214EC0775FF9526′ nicht zulässig. Er wird für die Erzwingung der PRIMARY KEY-Beschränkung verwendet.‘
Die obige Fehlermeldung beweist also, dass SQL Server intern den UNIQUE-Index verwendet, um die Eindeutigkeit der Werte und des Primärschlüssels zu erzwingen.
Um den Primärschlüssel und den Index zu sehen, erweitern Sie den Ordner „keys“ im Objekt-Explorer-Fenster, und Sie können die Primärschlüssel-Beschränkung sehen. Erweitern Sie in ähnlicher Weise den Ordner „Indizes“ im Objekt-Explorer-Fenster, und Sie können den eindeutigen geclusterten Index sehen, wie im folgenden Diagramm dargestellt.
Wie Sie im Objekt-Explorer sehen können, wird nur das geclusterte Wort angezeigt. Um zu bestätigen, ob es sich um einen UNIQUE-Index handelt oder nicht, klicken Sie mit der rechten Maustaste auf den Index und wählen Sie Eigenschaften. Im Eigenschaftsfenster ist das Kontrollkästchen UNIQUE aktiviert, wie in der folgenden Abbildung zu sehen ist.
DELETE Clustered Index
Wir können den Unique Clustered Index nicht mit dem DROP-Befehl löschen, aber SQL Server erlaubt uns, den UNIQUE CLUSTERED INDEX aus dem Objekt-Explorer zu löschen. Klicken Sie also mit der rechten Maustaste auf den Index, wählen Sie dann die Option DELETE und klicken Sie schließlich auf OK. Sie können sehen, dass zusammen mit dem UNIQUE-Index auch die Primärschlüssel-Beschränkung gelöscht wird.
Nun lassen Sie uns versuchen, einige doppelte Werte für die ID-Spalte der Mitarbeiter einzufügen und Sie können sehen, dass die Zeilen in die Tabelle eingefügt werden, ohne dass eine Primärschlüsselverletzung auftritt.
INSERT INTO Mitarbeiter VALUES(2,’Priyanka‘, ‚Dwegaan‘,4500,’Weiblich‘,’Mumbai‘)
INSERT INTO Mitarbeiter VALUES(2,’Preety‘, ‚Tiwary‘,2500,’FEmale‘,’Delhi‘)
Nach dem Einfügen der beiden obigen Datensätze überprüfen Sie die Tabelle „Mitarbeiter“ wie unten gezeigt.
SELECT * FROM Mitarbeiter
Ausgabe:
Damit ist bewiesen, dass der UNIQUE-Index in SQL Server verwendet wird, um die Eindeutigkeit der Werte und die Primärschlüssel-Beschränkung zu erzwingen.
Die UNIQUENESS ist eine Eigenschaft eines Index in SQL Server und sowohl CLUSTERED als auch NON-CLUSTERED Indizes können als UNIQUE erstellt werden.
Hinweis:
Wir können keinen eindeutigen Index auf einer einzelnen Spalte erstellen, wenn diese Spalte in mehr als einer Zeile NULL enthält. Ebenso können wir keinen eindeutigen Index auf mehreren Spalten erstellen, wenn die Kombination von Spalten in mehr als einer Zeile NULL enthält. Diese werden für Indizierungszwecke als doppelte Werte behandelt.
Lassen Sie uns einen eindeutigen, nicht geclusterten Index auf den Spalten Vorname und Nachname der Tabelle Mitarbeiter erstellen
CREATE UNIQUE NONCLUSTERED INDEX UIX_Employees_FastNamee_LastName On Employees(FastName, LastName)
Der obige eindeutige, nicht geclusterte Index stellt sicher, dass keine 2 Einträge im Index den gleichen Vor- und Nachnamen haben.
Im Artikel Unique Constraint haben wir bereits besprochen, dass eine Unique Constraint in SQL Server verwendet werden kann, um die Eindeutigkeit von Werten in einer oder mehreren Spalten zu erzwingen.
Hinweis: Die Unique Constraint in SQL Server kann entweder unique clustered oder unique non-clustered sein. Wenn beim Erstellen eines Index in SQL Server nicht angegeben wird, ob er geclustert oder nicht geclustert ist, ist er standardmäßig nicht geclustert.
Was sind die Unterschiede zwischen UNIQUE-Beschränkungen und UNIQUE-Index?
Es gibt keine großen Unterschiede zwischen einer Unique-Beschränkung und einem Unique-Index in SQL Server. Wenn wir eine eindeutige Einschränkung hinzufügen, wird im Hintergrund sogar ein eindeutiger Index erstellt.
Um dies zu verstehen, fügen wir eine eindeutige Einschränkung für die Spalte „Stadt“ der Tabelle „Mitarbeiter“ hinzu
ALTER TABLE „Mitarbeiter“ ADD CONSTRAINT UQ_Mitarbeiter_Stadt UNIQUE (Stadt)
Wenn wir nun die obige Abfrage ausführen, erhalten wir den folgenden Fehler.
Die CREATE UNIQUE INDEX-Anweisung wurde abgebrochen, weil ein doppelter Schlüssel für den Objektnamen ‚dbo.Employees‘ und den Indexnamen ‚UQ_Emplyees_City‘ gefunden wurde. Der Wert des doppelten Schlüssels ist (Mumbai).
Das liegt daran, dass wir bereits doppelte Werte in der Spalte „Stadt“ der Tabelle „Mitarbeiter“ haben und daher das Erstellen eines eindeutigen Index für die Spalte „Stadt“ nicht möglich ist.
So lassen Sie uns zuerst die Tabelle abschneiden und dann den Index wie unten gezeigt erstellen.
TRUNCATE TABLE Employees
ALTER TABLE Employees ADD CONSTRAINT UQ_Emplyees_City UNIQUE (City)
Nun wurde die Anweisung erfolgreich ausgeführt.
An dieser Stelle können Sie erwarten, dass eine eindeutige Beschränkung im Ordner „Beschränkungen“ erstellt wird. Aktualisieren und erweitern Sie den Constraints-Ordner im Objekt-Explorer-Fenster und Sie können sehen, dass der Constraint nicht in diesem Ordner vorhanden ist. Aktualisieren und erweitern Sie nun den Ordner „Indizes“ und im Ordner „Indizes“ sehen Sie einen UNIQUE NON-CLUSTERED-Index mit dem Namen UQ_Employees_City wie unten dargestellt.
Sie können die verfügbaren Beschränkungen einer Tabelle auch überprüfen, indem Sie die gespeicherte Systemprozedur SP_HELPCONSTRAINT wie unten gezeigt
EXECUTE SP_HELPCONSTRAINT Employees
Das folgende Ergebnis wird angezeigt.
Wenn wir eine UNIQUE-Beschränkung in SQL Server erstellen, wird im Hintergrund ein UNIQUE-Index erstellt. Ein UNIQUE-Index in SQL Server kann also explizit mit der Anweisung CREATE INDEX oder indirekt mit einem UNIQUE-Constraint erstellt werden.
Wann sollten Sie einen Unique-Constraint über einen Unique-Index erstellen?
Um die Absichten klar zu machen, erstellen Sie einen Unique-Constraint, wenn die Datenintegrität das Ziel ist. Damit wird das Ziel des Indexes sehr deutlich. In beiden Fällen werden die Daten auf die gleiche Weise validiert, und der Abfrageoptimierer unterscheidet nicht zwischen einem eindeutigen Index, der durch eine eindeutige Einschränkung oder manuell erstellt wurde.
HINWEIS:
Wenn wir eine PRIMARY KEY-Beschränkung in SQL Server erstellen, wird automatisch ein eindeutiger geclusterter Index auf der Spalte oder den Spalten erstellt, wenn ein geclusterter Index auf der Tabelle nicht bereits vorhanden ist und wir keinen eindeutigen nicht geclusterten Index angeben.
Wenn wir eine UNIQUE-Beschränkung in SQL Server erstellen, wird automatisch ein eindeutiger nicht-geclusterter Index erstellt, um eine UNIQUE-Beschränkung standardmäßig zu erzwingen. Sie können einen eindeutigen geclusterten Index angeben, wenn ein geclusterter Index auf der Tabelle noch nicht vorhanden ist.
Wir können keine UNIQUE-Beschränkung oder einen UNIQUE-Index in SQL Server auf einer vorhandenen Tabelle erstellen, wenn die Tabelle doppelte Werte in den Schlüsselspalten enthält. Um dies zu lösen, müssen Sie die Schlüsselspalten aus der Indexdefinition entfernen oder die doppelten Werte löschen oder aktualisieren.
Standardmäßig sind doppelte Werte in Schlüsselspalten nicht erlaubt, wenn Sie einen eindeutigen Index oder eine Einschränkung haben. Wenn Sie z. B. versuchen, 10 Zeilen einzufügen, von denen 5 Zeilen Duplikate enthalten, dann werden alle 10 Zeilen zurückgewiesen. Wenn jedoch nur die 5 doppelten Zeilen zurückgewiesen werden sollen und die 5 nicht doppelten Zeilen akzeptiert werden sollen, dann kann die Option IGNORE_DUP_KEY verwendet werden. Ein Beispiel für die Verwendung der Option IGNORE_DUP_KEY ist unten dargestellt.
CREATE UNIQUE INDEX IX_Employees_City ON Employees(City) WITH IGNORE_DUP_KEY
Beschränkungen und Einschränkungen
Der einzigartige Index, UNIQUE-Beschränkung oder PRIMARY KEY-Beschränkung kann nicht erstellt werden, wenn doppelte Schlüsselwerte in den Daten vorhanden sind.
Ein eindeutiger, nicht geclusterter Index kann eingeschlossene Nicht-Schlüsselspalten enthalten
Im nächsten Artikel werde ich anhand von Beispielen erläutern, wie der Index in der GROUP BY-Klausel in SQL Server verwendet werden kann.