Einschränkungen in SQL Server sind vordefinierte Regeln, die Sie für einzelne oder mehrere Spalten erzwingen können. Diese Einschränkungen tragen dazu bei, die Integrität, Zuverlässigkeit und Genauigkeit der in diesen Spalten gespeicherten Werte aufrechtzuerhalten. Sie können Einschränkungen mit CREATE TABLE- oder ALTER Table-Anweisungen erstellen. Wenn Sie die ALTER TABLE-Anweisung verwenden, überprüft SQL Server die vorhandenen Spaltendaten, bevor die Einschränkung erstellt wird.
Wenn Sie Daten in die Spalte einfügen, die die Kriterien der Einschränkungsregel erfüllen, fügt SQL Server Daten erfolgreich ein. Wenn jedoch Daten gegen die Einschränkung verstoßen, wird die Einfügeanweisung mit einer Fehlermeldung abgebrochen.
Stellen Sie sich beispielsweise vor, Sie haben eine [Employee]-Tabelle, in der die Mitarbeiterdaten Ihrer Organisation gespeichert sind, einschließlich ihres Gehalts. Für die Werte in der Gehaltsspalte gibt es ein paar Faustregeln.
- Die Spalte darf keine negativen Werte wie -10.000 oder -15.000 USD enthalten.
- Sie möchten auch den maximalen Gehaltswert angeben. Beispielsweise sollte das maximale Gehalt weniger als 2.000.000 USD betragen.
Wenn Sie einen neuen Datensatz mit einer Einschränkung einfügen, validiert SQL Server den Wert anhand der definierten Regeln.
Eingefügter Wert:
Gehalt 80.000:Erfolgreich eingefügt
Gehalt -50.000: Fehler
Wir werden in diesem Artikel die folgenden Einschränkungen in SQL Server untersuchen.
- NICHT NULL
- EINZIGARTIG
- ÜBERPRÜFEN
- PRIMÄRSCHLÜSSEL
- Fremdschlüssel
- STANDARD
NOT NULL-Einschränkung
Standardmäßig erlaubt SQL Server das Speichern von NULL-Werten in Spalten. Diese NULL-Werte stellen keine gültigen Daten dar.
Beispielsweise muss jeder Mitarbeiter in einer Organisation eine Emp-ID, einen Vornamen, ein Geschlecht und eine Adresse haben. Daher können Sie eine Spalte mit NOT NULL-Einschränkungen angeben, um immer gültige Werte sicherzustellen.
Das folgende CREATE TABLE-Skript definiert NOT NULL-Einschränkungen für die Spalten [ID], [Vorname], [Nachname], [Geschlecht] und [Adresse].
CREATE TABLE Employees ( ID INT NOT NULL, [FirstName] Varchar(100) NOT NULL, [MiddleName] Varchar(50) NULL, [LastName] Varchar(100) NOT NULL, [Gender] char(1) NOT NULL, [Address] Varchar(200) NOT NULL )
Um das Verhalten der NOT NULL-Einschränkungen zu validieren, verwenden wir die folgenden INSERT-Anweisungen.
- Fügen Sie Werte für alle Spalten ein (NULL und NOT NULL) – Einfügungen erfolgreich
INSERT INTO Employees (ID,[FirstName],[MiddleName],[LastName],[gender],[Address]) VALUES(1,'Raj','','Gupta','M','India')
- Werte für Spalten mit NOT NULL-Eigenschaft einfügen – erfolgreich eingefügt
INSERT INTO Employees (ID,[FirstName],[LastName],[gender],[Address]) VALUES(2, 'Shyam','Agarwal','M','UK')
- Überspringen Sie das Einfügen von Werten für die Spalte [Nachname] mit NOT NULL-Einschränkungen – Fehler+
INSERT INTO Employees (ID,[FirstName],[gender],[Address]) VALUES(3,'Sneha','F','India')
Die letzte INSERT-Anweisung hat den Fehler ausgelöst – NULL-Werte können nicht in die Spalte eingefügt werden .
Diese Tabelle enthält die folgenden Werte, die in die Tabelle [Employees] eingefügt wurden.
Angenommen, wir benötigen gemäß HR-Anforderungen keine NULL-Werte in der Spalte [MiddleName]. Zu diesem Zweck können Sie die ALTER TABLE-Anweisung verwenden.
ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
Diese ALTER TABLE-Anweisung schlägt aufgrund der vorhandenen Werte der Spalte [MiddleName] fehl. Um die Einschränkung durchzusetzen, müssen Sie diese NULL-Werte eliminieren und dann die ALTER-Anweisung ausführen.
UPDATE Employees SET [MiddleName]='' WHERE [MiddleName] IS NULL Go ALTER TABLE Employees ALTER COLUMN [MiddleName] VARCHAR(50) NOT NULL
Sie können die NOT NULL-Einschränkungen auch mit dem SSMS-Tabellen-Designer validieren.
EINZIGARTIGE Beschränkung
Die UNIQUE-Einschränkung in SQL Server stellt sicher, dass Sie keine doppelten Werte in einer einzelnen Spalte oder Kombination von Spalten haben. Diese Spalten sollten Teil der UNIQUE-Einschränkungen sein. SQL Server erstellt automatisch einen Index, wenn UNIQUE-Einschränkungen definiert sind. Sie können nur einen eindeutigen Wert in der Spalte haben (einschließlich NULL).
Erstellen Sie beispielsweise die [DemoTable] mit der Spalte [ID] mit der Einschränkung UNIQUE.
CREATE TABLE DemoTable ( [ID] INT UNIQUE NOT NULL, [EmpName] VARCHAR(50) NOT NULL )
Erweitern Sie dann die Tabelle in SSMS, und Sie haben einen eindeutigen Index (nicht gruppiert), wie unten gezeigt.
Bitte klicken Sie mit der rechten Maustaste auf den Index und generieren Sie sein Skript. Wie unten gezeigt, wird das Schlüsselwort ADD UNIQUE NONCLUSTERED für die Einschränkung verwendet.
Die folgende Insert-Anweisung gibt einen Fehler aus, weil sie versucht, doppelte Werte einzufügen.
INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj') GO INSERT INTO DemoTable ([ID],[EmpName]) VALUES (2,'Alisha') GO INSERT INTO DemoTable ([ID],[EmpName]) VALUES (1,'Raj') GO
CHECK-Einschränkung
Die CHECK-Einschränkung in SQL Server definiert einen gültigen Wertebereich, der in angegebene Spalten eingefügt werden kann. Es wertet jeden eingefügten oder geänderten Wert aus, und wenn es erfüllt ist, wird die SQL-Anweisung erfolgreich abgeschlossen.
Das folgende SQL-Skript platziert eine Einschränkung für die Spalte [Age]. Sein Wert sollte größer als 18 Jahre sein.
CREATE TABLE DemoCheckConstraint ( ID INT PRIMARY KEY, [EmpName] VARCHAR(50) NULL, [Age] INT CHECK (Age>18) ) GO
Lassen Sie uns zwei Datensätze in diese Tabelle einfügen. Die Abfrage fügt den ersten Datensatz erfolgreich ein.
INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (1,'Raj',20) Go INSERT INTO DemoCheckConstraint (ID,[EmpName],[Age])VALUES (2,'Sohan',17) GO
Die zweite INSERT-Anweisung schlägt fehl, weil sie die CHECK-Einschränkungsbedingung nicht erfüllt.
Ein weiterer Anwendungsfall für die CHECK-Einschränkung ist das Speichern gültiger Werte von Postleitzahlen. Im folgenden Skript fügen wir eine neue Spalte [Postleitzahl] hinzu und verwenden die CHECK-Einschränkung, um die Werte zu validieren.
ALTER TABLE DemoCheckConstraint ADD zipcode int GO ALTER TABLE DemoCheckConstraint ADD CONSTRAINT CK_zipcode CHECK (zipcode LIKE REPLICATE ('[0-9]', 5))
Diese CHECK-Einschränkung lässt keine ungültigen Postleitzahlen zu. Beispielsweise generiert die zweite INSERT-Anweisung einen Fehler.
INSERT INTO DemoCheckConstraint values(3,'Sneha',19,30203) Go INSERT INTO DemoCheckConstraint values(4,'Jenny',21,122102)
PRIMARY KEY-Einschränkung
Die PRIMARY KEY-Einschränkung in SQL Server ist eine beliebte Wahl unter Datenbankexperten, um eindeutige Werte in einer relationalen Tabelle zu implementieren. Es kombiniert UNIQUE- und NOT NULL-Einschränkungen. SQL Server erstellt automatisch einen geclusterten Index, sobald wir eine PRIMARY KEY-Einschränkung definieren. Sie können eine einzelne Spalte oder eine Reihe von Kombinationen verwenden, um eindeutige Werte in einer Zeile zu definieren.
Sein Hauptzweck besteht darin, die Integrität der Tabelle mithilfe des eindeutigen Entitäts- oder Spaltenwerts zu erzwingen.
Sie ähnelt der UNIQUE-Einschränkung mit den folgenden Unterschieden.
PRIMÄRSCHLÜSSEL | EINZIGARTIGER SCHLÜSSEL |
Es verwendet eine eindeutige Kennung für jede Zeile in einer Tabelle. | Es definiert eindeutig Werte in einer Tabellenspalte. |
Sie können keine NULL-Werte in die PRIMARY KEY-Spalte einfügen. | Es kann einen NULL-Wert in der eindeutigen Schlüsselspalte akzeptieren. |
Eine Tabelle kann nur eine PRIMARY KEY-Einschränkung haben. | Sie können in SQL Server mehrere UNIQUE KEY-Einschränkungen erstellen. |
Standardmäßig erstellt es einen gruppierten Index für die PRIMARY KEY-Spalten. | Der UNIQUE KEY erstellt einen nicht gruppierten Index für die Primärschlüsselspalten. |
Das folgende Skript definiert den PRIMARY KEY in der ID-Spalte.
CREATE TABLE PrimaryKeyDemo ( ID INT PRIMARY KEY, [Name] VARCHAR(100) NULL )
Wie unten gezeigt, haben Sie einen gruppierten Schlüsselindex, nachdem Sie den PRIMARY KEY in der ID-Spalte definiert haben.
Lassen Sie uns die Datensätze mit den folgenden INSERT-Anweisungen in die Tabelle [PrimaryKeyDemo] einfügen.
INSERT INTO PrimaryKeyDemo ([ID],[NAME]) VALUES (1,'Raj') GO INSERT INTO PrimaryKeyDemo ([NAME]) VALUES ('Mohan') GO
Sie erhalten einen Fehler in der zweiten INSERT-Anweisung, da versucht wird, den NULL-Wert einzufügen.
Wenn Sie versuchen, doppelte Werte einzufügen, erhalten Sie die folgende Fehlermeldung.
FREMDSCHLÜSSEL-Einschränkung
Die FOREIGN KEY-Einschränkung in SQL Server erstellt Beziehungen zwischen zwei Tabellen. Diese Beziehung wird als Eltern-Kind-Beziehung bezeichnet. Es erzwingt die referenzielle Integrität in SQL Server.
Der Fremdschlüssel der untergeordneten Tabelle sollte einen entsprechenden Eintrag in der Spalte des übergeordneten Primärschlüssels haben. Sie können keine Werte in die untergeordnete Tabelle einfügen, ohne sie zuerst in die übergeordnete Tabelle einzufügen. Ebenso müssen wir zuerst den Wert aus der untergeordneten Tabelle entfernen, bevor er aus der übergeordneten Tabelle gelöscht werden kann.
Da wir keine doppelten Werte in der PRIMARY KEY-Einschränkung haben können, sind auch keine Duplikate oder NULL in der untergeordneten Tabelle zulässig.
Das folgende SQL-Skript erstellt eine übergeordnete Tabelle mit einem Primärschlüssel und eine untergeordnete Tabelle mit einem Primär- und Fremdschlüsselverweis auf die Spalte [EmpID] der übergeordneten Tabelle.
CREATE TABLE ParentTable ( [EmpID] INT PRIMARY KEY, [Name] VARCHAR(50) NULL ) GO CREATE TABLE ChildTable ( [ID] INT PRIMARY KEY, [EmpID] INT FOREIGN KEY REFERENCES ParentTable(EmpID) )
Datensätze in beide Tabellen einfügen. Beachten Sie, dass der Fremdschlüsselwert der untergeordneten Tabelle einen Eintrag in der übergeordneten Tabelle hat.
INSERT INTO ParentTable VALUES (1,'Raj'),(2,'Komal') INSERT INTO ChildTable VALUES (101,1),(102,2)
Wenn Sie versuchen, einen Datensatz direkt in die untergeordnete Tabelle einzufügen, der nicht auf den Primärschlüssel der übergeordneten Tabelle verweist, erhalten Sie die folgende Fehlermeldung.
STANDARD-Einschränkung
Die DEFAULT-Einschränkung in SQL Server stellt den Standardwert für eine Spalte bereit. Wenn wir in der INSERT-Anweisung keinen Wert für die Spalte mit der DEFAULT-Einschränkung angeben, verwendet SQL Server den standardmäßig zugewiesenen Wert. Angenommen, eine Bestelltabelle enthält Datensätze für alle Kundenbestellungen. Sie können die GETDATE()-Funktion verwenden, um das Bestelldatum zu erfassen, ohne einen expliziten Wert anzugeben.
CREATE TABLE Orders ( [OrderID] INT PRIMARY KEY, [OrderDate] DATETIME NOT NULL DEFAULT GETDATE() ) GO
Um die Datensätze in diese Tabelle einzufügen, können wir die Zuweisung von Werten für die Spalte [OrderDate] überspringen.
INSERT INTO Orders([OrderID]) values (1) GO
AUSWÄHLEN * AUS Bestellungen
Sobald die Einschränkungsspalte DEFAULT einen expliziten Wert angibt, speichert SQL Server diesen expliziten Wert anstelle des Standardwerts.
Einschränkungsvorteile
Die Beschränkungen in SQL Server können in den folgenden Fällen von Vorteil sein:
- Durchsetzung der Geschäftslogik
- Erzwingen der referenziellen Integrität
- Verhindern, dass unzulässige Daten in SQL Server-Tabellen gespeichert werden
- Eindeutigkeit für Spaltendaten erzwingen
- Verbesserung der Abfrageleistung, da der Abfrageoptimierer eindeutige Daten erkennt und Wertesätze validiert
- Speichern von NULL-Werten in SQL-Tabellen verhindern
- Schreiben von Codes, um NULL zu vermeiden, während Daten in der Anwendung angezeigt werden