Zusammenfassung: In diesem Tutorial lernen Sie, wie Sie die SQL Server UNIQUE
-Beschränkung verwenden, um die Eindeutigkeit von Daten in einer Spalte oder einer Gruppe von Spalten sicherzustellen.
Einführung in die SQL Server UNIQUE-Beschränkung
Mit SQL Server UNIQUE
-Beschränkungen können Sie sicherstellen, dass die in einer Spalte oder einer Gruppe von Spalten gespeicherten Daten in den Zeilen einer Tabelle eindeutig sind.
Die folgende Anweisung erstellt eine Tabelle, deren Daten in der Spalte email
unter den Zeilen der Tabelle hr.persons
eindeutig sind:
Code language: SQL (Structured Query Language) (sql)CREATE SCHEMA hr;GOCREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);
In dieser Syntax definieren Sie die UNIQUE
Beschränkung als Spaltenbeschränkung. Sie können die UNIQUE
-Beschränkung auch als Tabellenbeschränkung definieren, etwa so:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), UNIQUE(email));
Hinter den Kulissen erstellt SQL Server automatisch einen UNIQUE
-Index, um die Eindeutigkeit der Daten zu erzwingen, die in den Spalten gespeichert sind, die an der UNIQUE
-Einschränkung teilnehmen. Wenn Sie daher versuchen, eine doppelte Zeile einzufügen, weist SQL Server die Änderung zurück und gibt eine Fehlermeldung zurück, die besagt, dass die UNIQUE
-Beschränkung verletzt wurde.
Die folgende Anweisung fügt eine neue Zeile in die hr.persons
Tabelle ein:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('John','Doe','[email protected]');
Die Anweisung funktioniert wie erwartet. Die folgende Anweisung schlägt jedoch aufgrund der doppelten E-Mail fehl:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name, email)VALUES('Jane','Doe','[email protected]');
SQL Server gibt die folgende Fehlermeldung aus:
Code language: Shell Session (shell)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is ([email protected]).
Wenn Sie keinen separaten Namen für die UNIQUE
-Beschränkung angeben, generiert SQL Server automatisch einen Namen für sie. In diesem Beispiel lautet der Name der Einschränkung UQ__persons__AB6E616417240E4E
, was nicht ganz lesbar ist.
Um einem UNIQUE
Constraint einen bestimmten Namen zuzuweisen, verwenden Sie das CONSTRAINT
Schlüsselwort wie folgt:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), CONSTRAINT unique_email UNIQUE(email));
Nachfolgend die Vorteile, einem UNIQUE
-Constraint einen bestimmten Namen zuzuweisen:
- Es ist einfacher, die Fehlermeldung zu klassifizieren.
- Sie können den Namen des Constraints referenzieren, wenn Sie es ändern wollen.
UNIQUE Constraint vs. PRIMARY KEY-Beschränkung
Obwohl beide UNIQUE
und PRIMARY KEY
Beschränkungen die Eindeutigkeit der Daten erzwingen, Sie sollten die UNIQUE
-Beschränkung anstelle der PRIMARY KEY
-Beschränkung verwenden, wenn Sie die Eindeutigkeit einer Spalte oder einer Gruppe von Spalten erzwingen wollen, die nicht die Primärschlüsselspalten sind.
Im Unterschied zu PRIMARY KEY
-Constraints, erlauben UNIQUE
-Constraints NULL
. Außerdem behandeln UNIQUE
-Constraints das NULL
wie einen regulären Wert, daher ist nur ein NULL
pro Spalte erlaubt.
Die folgende Anweisung fügt eine Zeile ein, deren Wert in der Spalte email
NULL
ist:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('John','Smith');
Wenn Sie nun versuchen, ein weiteres NULL
in die Spalte email
einzufügen, erhalten Sie einen Fehler:
Code language: SQL (Structured Query Language) (sql)INSERT INTO hr.persons(first_name, last_name)VALUES('Lily','Bush');
Hier ist die Ausgabe:
Code language: SQL (Structured Query Language) (sql)Violation of UNIQUE KEY constraint 'UQ__persons__AB6E616417240E4E'. Cannot insert duplicate key in object 'hr.persons'. The duplicate key value is (<NULL>).
UNIQUE-Beschränkungen für eine Gruppe von Spalten
Um eine UNIQUE
-Beschränkung für eine Gruppe von Spalten zu definieren, schreiben Sie sie als Tabellenbeschränkung mit durch Kommas getrennten Spaltennamen wie folgt:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE table_name ( key_column data_type PRIMARY KEY, column1 data_type, column2 data_type, column3 data_type, ..., UNIQUE (column1,column2));
Das folgende Beispiel erstellt eine UNIQUE
-Beschränkung, die aus zwei Spalten person_id
und skill_id
besteht:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.person_skills ( id INT IDENTITY PRIMARY KEY, person_id int, skill_id int, updated_at DATETIME, UNIQUE (person_id, skill_id));
Hinzufügen von UNIQUE-Beschränkungen zu vorhandenen Spalten
Wenn Sie eine UNIQUE
-Beschränkung zu einer vorhandenen Spalte oder einer Gruppe von Spalten in einer Tabelle hinzufügen, untersucht SQL Server zunächst die vorhandenen Daten in diesen Spalten, um sicherzustellen, dass alle Werte eindeutig sind. Wenn SQL Server doppelte Werte findet, gibt er einen Fehler zurück und fügt die UNIQUE
-Beschränkung nicht hinzu.
Das Folgende zeigt die Syntax des Hinzufügens einer UNIQUE
-Beschränkung zu einer Tabelle:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameADD CONSTRAINT constraint_name UNIQUE(column1, column2,...);
Angenommen, Sie haben die folgende hr.persons
-Tabelle:
Code language: SQL (Structured Query Language) (sql)CREATE TABLE hr.persons ( person_id INT IDENTITY PRIMARY KEY, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255), phone VARCHAR(20),);
Die folgende Anweisung fügt der Spalte email
eine UNIQUE
-Beschränkung hinzu:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_email UNIQUE(email);
In ähnlicher Weise fügt die folgende Anweisung eine UNIQUE
-Beschränkung zur Telefonspalte hinzu:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsADD CONSTRAINT unique_phone UNIQUE(phone);
Unique-Beschränkungen löschen
Um eine UNIQUE
-Beschränkung zu definieren, verwenden Sie die Anweisung ALTER TABLE DROP CONSTRAINT
wie folgt:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE table_nameDROP CONSTRAINT constraint_name;
Die folgende Anweisung entfernt die unique_phone
-Beschränkung aus der hr.Personentabelle:
Code language: SQL (Structured Query Language) (sql)ALTER TABLE hr.personsDROP CONSTRAINT unique_phone;
Ändern von UNIQUE-Beschränkungen
SQL Server hat keine direkte Anweisung, um eine UNIQUE
-Beschränkung zu ändern, daher müssen Sie die Beschränkung zuerst löschen und neu erstellen, wenn Sie die Beschränkung ändern möchten.
In diesem Lernprogramm haben Sie gelernt, wie Sie die SQL Server UNIQUE
-Beschränkung verwenden, um sicherzustellen, dass die in einer Spalte oder einer Gruppe von Spalten enthaltenen Daten eindeutig sind.