Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Einblick in die Unique Constraints von SQL Server

Was sind eindeutige Schlüsseleinschränkungen?

Eine eindeutige Einschränkung ist eine Regel, die Spalteneinträge auf eindeutig beschränkt. Mit anderen Worten, diese Art von Einschränkungen verhindert das Einfügen von Duplikaten in eine Spalte. Eine eindeutige Einschränkung ist eines der Instrumente, um die Datenintegrität in einer SQL Server-Datenbank zu erzwingen. Da eine Tabelle nur einen Primärschlüssel haben kann, können Sie eine eindeutige Einschränkung verwenden, um die Eindeutigkeit einer Spalte oder einer Kombination von Spalten zu erzwingen, die keinen Primärschlüssel darstellen.

Durch das Erstellen einer eindeutigen Einschränkung für eine Spalte wird automatisch ein eindeutiger Index erstellt. Auf diese Weise implementiert SQL Server die Integritätsanforderung der Unique-Einschränkung. Wenn Sie versuchen, einen doppelten Wert in eine Spalte einzufügen, für die eine Eindeutigkeitseinschränkung definiert ist, erkennt das Datenbankmodul daher die Verletzung der Eindeutigkeitseinschränkung und gibt einen entsprechenden Fehler aus. Daher wird die Zeile mit den doppelten Werten keiner Tabelle hinzugefügt.

Erstellen einer eindeutigen Einschränkung

Die folgende Beispielabfrage erstellt die Students Tabelle und eine eindeutige Einschränkung für die Anmeldung Spalte, damit es keine Schüler mit demselben Login gibt.

CREATE TABLE Students (
Login CHAR NOT NULL
,CONSTRAINT AK_Student_Login UNIQUE (Login)
);
GO

Wenn die Studenten Tabelle bereits existiert, können Sie die folgende Beispielabfrage verwenden, um die Unique-Einschränkung zu erstellen.

ALTER TABLE Students
ADD CONSTRAINT AK_Student_Login UNIQUE (Login);
GO

Beachten Sie, dass das Datenbankmodul beim Hinzufügen einer Unique-Einschränkung zu einer vorhandenen Tabelle überprüft, ob die Spalte, zu der die Einschränkung hinzugefügt wird, doppelte Werte enthält. Wenn solche Werte vorhanden sind, wird die Einschränkung nicht hinzugefügt und gibt einen Fehler zurück.

Um nun zu überprüfen, ob die eindeutige Einschränkung tatsächlich hinzugefügt wurde, führen Sie die folgenden Anweisungen aus:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

Hier ist die Einschränkung, die wir erstellt haben:

Erstellen einer eindeutigen Einschränkung in SQL Server Management Studio

Angenommen, wir müssen eine eindeutige Einschränkung für die Anmeldung definieren Spalte es die Studenten Tabelle.

1. Im Objekt-Explorer , klicken Sie mit der rechten Maustaste auf Studenten Tabelle und klicken Sie auf Design .

2. Klicken Sie mit der rechten Maustaste auf den Tabellen-Designer und wählen Sie Indexe/Schlüssel…

3. In den Indizes/Schlüsseln Klicken Sie im Fenster auf Hinzufügen .

4. Unter dem Allgemein Klicken Sie im Abschnitt auf Spalten und klicken Sie dann auf die Schaltfläche mit den Auslassungspunkten. In den Indexspalten Wählen Sie im Fenster die Spalte(n) aus, die Sie in die Eindeutigkeitsbeschränkung einschließen möchten.

5. Unter dem Allgemein Klicken Sie im Abschnitt auf Eingabe und wählen Sie Eindeutiger Schlüssel aus aus der Dropdown-Liste.

6. Unter der Identität Geben Sie im Abschnitt den Namen der Einschränkung an (in unserem Fall AK_Student_Login ) und klicken Sie auf Schließen um die neu erstellte Einschränkung zu speichern.

Gehen Sie jetzt zu den Studenten Tabelle im Objekt-Explorer und klicken Sie auf die Indizes -Ordner sehen Sie, dass die Tabelle einen Primärschlüssel und eine eindeutige Einschränkung AK_Student_Login enthält .

Wie unterscheiden sich Unique Constraints von Primärschlüsseln?

Ähnlich wie eine eindeutige Einschränkung wird auch ein Primärschlüssel verwendet, um die Datenintegrität in einer Tabelle zu erzwingen. Der Hauptzweck eines Primärschlüssels besteht jedoch darin, jeden Datensatz in einer Tabelle eindeutig zu identifizieren und ordnungsgemäße Beziehungen zwischen Tabellen in einer Datenbank zu implementieren. In 99 % der Tabellen ist ein Primärschlüssel erforderlich, um den ordnungsgemäßen Zugriff auf Tabellenzeilen zu ermöglichen. Es kann nur einen Primärschlüssel pro Tabelle geben, der für eine oder mehrere Spalten definiert ist.

Eindeutigkeitsbeschränkungen werden speziell verwendet, um zu verhindern, dass doppelte Werte in eine Spalte eingefügt werden. Es kann mehrere Spalten mit eindeutigen Einschränkungen geben, oder es können überhaupt keine eindeutigen Einschränkungen für eine Tabelle definiert sein. Im Gegensatz zu Primärschlüsseln sind sie für eine Tabelle nicht obligatorisch.

Nehmen wir an, wir haben die Studenten Tabelle mit persönlichen Informationen über jeden Studenten an einer Universität. Die Tabelle enthält die StudentID Spalte, die ein Primärschlüssel ist und eine eindeutige ID jedes einzelnen Schülers speichert. Diese Primärschlüsselspalte wird verwendet, um jeden Studenten an einer Universität eindeutig zu identifizieren.

Gleichzeitig die Studenten Tabelle hat Spalten wie E-Mail , Sozialversicherungsnummer und Anmelden und jede dieser Spalten muss eindeutige Werte speichern. Da es bereits einen Primärschlüssel in der Tabelle gibt, verwenden wir stattdessen eindeutige Einschränkungen, um diesen Spalten Eindeutigkeit aufzuerlegen. Daher kann eine Tabelle viele Unique Constraints und nur einen Primärschlüssel haben.

Eine andere Sache, die eine eindeutige Einschränkung von einem Primärschlüssel unterscheidet, ist, dass der Primärschlüssel keine NULL zulässt Werten in einer Spalte, wohingegen eine Spalte mit einer eindeutigen Einschränkung eine NULL enthalten kann Wert, sondern nur einen, da SQL Server zwei NULL-Werte als dieselben Werte interpretiert.

Angenommen, für die E-Mail wird eine Eindeutigkeitsbeschränkung erstellt Spalte der Studenten Tisch. Versuchen wir, zwei Zeilen einzufügen, beide mit NULL s in der E-Mail Felder:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')

GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')

GO

Wir erhalten folgende Fehlermeldung:

Nun, das ist ein vorhersehbares Verhalten, da doppelte Werte, selbst wenn sie NULL-Werte sind, von der Unique-Einschränkung nicht zugelassen werden.

Eindeutige Einschränkung vs. eindeutiger Index

Obwohl sowohl die eindeutige Einschränkung als auch der eindeutige Index zwei völlig unterschiedliche, voneinander unabhängige Datenbankentitäten sind, haben sie dasselbe Ziel und dieselbe Auswirkung auf die Leistung von SQL Server. Beide gewährleisten die Eindeutigkeit der Daten in einer Spalte.

Im Gegensatz zum eindeutigen Index können Sie jedoch die Optionen IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX und STATISTICS_NORECOMPUTE für die eindeutige Einschränkung in den ALTER TABLE-Anweisungen nicht angeben.

Wenn Sie eine eindeutige Einschränkung für eine Spalte erstellen, erstellt SQL Server automatisch einen eindeutigen Index für die Spalte. Dies ist genau die Art und Weise, wie diese Funktion in SQL Server implementiert wird.

Um den eindeutigen Index zu löschen, müssen Sie zuerst die entsprechende eindeutige Einschränkung löschen, wodurch der zugrunde liegende eindeutige Index automatisch gelöscht wird.

Die folgende Anweisung löscht das AK_Student_Login Einschränkung:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

Sie können sehen, dass das AK_Student_Login gelöscht wird Unique Constraint löscht den entsprechenden Index.

Das war einfach, jetzt können Sie identische Werte in das Login einfügen Spalte.

Eindeutigkeitsbeschränkung deaktivieren

Es gibt eine Option, die eine eindeutige Einschränkung deaktiviert. Die folgende Abfrage soll alle Tabelleneinschränkungen deaktivieren:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

Nachdem wir die Abfrage ausgeführt haben, versuchen wir nun, einen doppelten Datensatz einzufügen:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')
GO

Was wir erhalten, ist die eindeutige Nachricht zur Verletzung der Einschränkung:

Daher scheint ALTER TABLE NOCHECK CONSTRAINT ALL GO nicht für eindeutige Einschränkungen in SQL Server zu funktionieren.

Denken Sie jedoch daran, dass es unter der Haube jeder eindeutigen Einschränkung einen eindeutigen Index gibt, und wir sollten in der Lage sein, einen eindeutigen Index zu deaktivieren. In unserem Fall die AK_Student_Email Unique Constraint hat die entsprechende AK_Student_Email erstellt eindeutiger Index für die E-Mail Säule. Verwenden wir die folgende Abfrage, um die AK_Student_Email zu deaktivieren Eindeutiger Index zuerst.

ALTER INDEX AK_Student_Email ON Students
DISABLE;

Die Abfrage wurde erfolgreich abgeschlossen, also fügen wir jetzt zwei Datensätze mit doppelter E-Mail ein Felder in die Studenten Tabelle.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')
GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')
GO

Es klappt! Die Datensätze wurden in die Tabelle eingefügt! Jetzt wissen wir, wie wir dieses Problem der „Behinderung“ mit einer eindeutigen Einschränkung umgehen können.

Um den Index zu aktivieren, verwenden Sie die folgende Abfrage:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

Schlussfolgerung

Eindeutige Schlüsseleinschränkungen ermöglichen es DBAs und SQL-Entwicklern, die Eindeutigkeit von Daten in Tabellenspalten zu erzwingen und zu bewahren sowie bestimmte Geschäftsanforderungen für die Datenintegrität anzuwenden. Grundsätzlich gibt es keinen wesentlichen Unterschied im Verhalten zwischen einer eindeutigen Einschränkung und einem eindeutigen Index, außer der Tatsache, dass die eindeutige Einschränkung nicht direkt deaktiviert werden kann und bestimmte Indexerstellungsoptionen für eindeutige Einschränkungen in der ALTER TABLE-Anweisung nicht verfügbar sind.

Hoffe, dieser Artikel war interessant. Sie können Fragen stellen, Kommentare und Vorschläge zu diesem Artikel hinterlassen.

Siehe auch: CHECK Constraints in SQL Server