Erstellen eindeutiger Indizes

Durch das Erstellen eines eindeutigen Index wird sichergestellt, dass jeder Versuch der Verdoppelung von Schlüsselwerten einen Fehler erzeugt. Es gibt keine bedeutenden Unterschiede zwischen dem Erstellen einer UNIQUE-Einschränkung und dem Erstellen eines eindeutigen, von Einschränkungen unabhängigen Index. Die Datenüberprüfung erfolgt auf dieselbe Weise, und der Abfrageoptimierer macht keinen Unterschied zwischen einem durch eine Einschränkung erstellten eindeutigen Index und einem manuell erstellten. Wenn jedoch Datenintegrität das Ziel ist, empfiehlt es sich, eine UNIQUE-Einschränkung auf der Spalte zu erstellen. Dies erklärt das Ziel des Index.

Typische Implementierungen

Eindeutige Indizes werden auf folgende Weise implementiert:

  • PRIMARY KEY- oder UNIQUE-Einschränkung

    Wenn Sie eine PRIMARY KEY-Einschränkung erstellen, wird automatisch ein eindeutiger gruppierter Index für die Spalte(n) erstellt, wenn noch kein gruppierter Index für die Tabelle vorhanden ist und Sie keinen eindeutigen nicht gruppierten Index angeben. Die Primärschlüsselspalte darf keine NULL-Werte zulassen.

    Wenn Sie eine UNIQUE-Einschränkung erstellen, wird ein eindeutiger nicht gruppierter Index erstellt, um standardmäßig eine UNIQUE-Einschränkung zu erzwingen. Sie können einen eindeutigen gruppierten Index angeben, wenn noch kein gruppierter Index für die Tabelle vorhanden ist.

    Weitere Informationen finden Sie unter PRIMARY KEY-Einschränkungen und UNIQUE-Einschränkungen.

  • Index unabhängig von einer Einschränkung

    Es können mehrere eindeutige nicht gruppierte Indizes für eine Tabelle definiert werden.

    Weitere Informationen finden Sie unter CREATE INDEX (Transact-SQL).

  • Indizierte Sicht

    Um eine indizierte Sicht zu erstellen, werden eindeutige gruppierte Indizes jeweils für eine oder mehrere Sichtspalten definiert. Die Sicht wird ausgeführt (materialisiert), und das Resultset wird auf der Blattebene des Index gespeichert, genauso wie die Tabellendaten in einem gruppierten Index gespeichert werden. Weitere Informationen finden Sie unter Erstellen von indizierten Sichten.

Problemlösung bei doppelten Werten

Ein eindeutiger Index bzw. eine eindeutige Einschränkung kann nicht erstellt werden, wenn bereits doppelte Werte in den Schlüsselspalten vorhanden sind. Wenn Sie beispielsweise einen eindeutigen zusammengesetzten Index für die Spalten FirstName und LastName erstellen möchten, jedoch zwei Zeilen in der Tabelle vorhanden sind, die die Werte **'Jane'**und 'Smith' in den Spalten FirstName und LastNameenthalten, kann kein eindeutiger Index erstellt werden. Dieses Problem kann auf eine der folgenden Arten gelöst werden:

  • Fügen Sie der Indexdefinition Spalten hinzu, oder entfernen Sie Spalten, um eine eindeutige Zusammensetzung zu erstellen. In dem vorhergehenden Beispiel könnte das Problem gelöst werden, indem Sie der Indexdefinition eine MiddleName-Spalte hinzufügen.

  • Wenn die doppelten Werte durch Dateneingabefehler entstanden sind, korrigieren Sie die Daten manuell, und erstellen Sie dann den Index bzw. die Einschränkung.

Verwenden der IGNORE_DUP_KEY-Option zur Behandlung von doppelten Werten

Beim Erstellen eines eindeutigen Index bzw. einer eindeutigen Einschränkung können Sie die IGNORE_DUP_KEY-Option auf ON oder OFF festlegen. Diese Option gibt die Fehlermeldung an, wenn ein Einfügevorgang versucht, doppelte Schlüsselwerte in einen eindeutigen Index einzufügen. Die IGNORE_DUP_KEY-Option gilt nur für Einfügevorgänge nach dem Erstellen oder Neuerstellen des Index. Beim Ausführen von CREATE INDEX, ALTER INDEX oder UPDATE hat die Option keine Auswirkungen. Die Standardeinstellung ist OFF.

  • ON
    Eine Warnmeldung wird ausgegeben, wenn doppelte Schlüsselwerte in einen eindeutigen Index eingefügt werden. Es schlagen nur die Zeilen fehl, die gegen die Eindeutigkeitseinschränkung verstoßen.

  • OFF
    Eine Fehlermeldung wird ausgegeben, wenn doppelte Schlüsselwerte in einen eindeutigen Index eingefügt werden. Für den gesamten INSERT-Vorgang wird ein Rollback ausgeführt.

Wenn beispielsweise eine einzelne Anweisung einer Tabelle mit einem eindeutigen Index 20 Zeilen hinzufügt und 10 dieser Zeilen doppelte Schlüsselwerte enthalten, werden standardmäßig alle 20 Zeilen zurückgewiesen. Wenn jedoch die IGNORE_DUP_KEY-Indexoption auf ON festgelegt ist, werden nur die 10 doppelten Schlüsselwerte zurückgewiesen. Die 10 anderen Schlüsselwerte werden in die Tabelle eingefügt.

IGNORE_DUP_KEY kann für Indizes, die für eine Sicht erstellt werden, nicht eindeutige Indizes, XML-Indizes, räumliche und gefilterte Indizes nicht auf ON festgelegt werden.

Um IGNORE_DUP_KEY anzuzeigen, verwenden Sie sys.indexes.

In abwärtskompatibler Syntax ist WITH IGNORE_DUP_KEY gleichwertig mit WITH IGNORE_DUP_KEY = ON.

Behandlung von NULL-Werten

Beim Erstellen von Indizes werden NULL-Werte als "gleich" betrachtet. Daher können Sie keinen eindeutigen Index bzw. keine UNIQUE-Einschränkung erstellen, wenn die Schlüsselwerte mehrerer Zeilen NULL-Werte enthalten. Wählen Sie für eindeutige Indizes bzw. eindeutige Einschränkungen Spalten aus, die als NOT NULL definiert sind.

Benötigter Speicherplatz

Das Verfahren zum Ermitteln der Speicherplatzanforderungen für eindeutige Indizes entspricht dem Verfahren für gruppierte und nicht gruppierte Indizes. Informationen zu den Speicherplatzanforderungen für Indizes finden Sie unter Ermitteln der Speicherplatzanforderungen für Indizes.

So erstellen Sie einen Index, wenn Sie eine Tabelle erstellen

So erstellen Sie einen Index für eine vorhandene Tabelle