In SQL Server können Sie einen CHECK
erstellen Einschränkung in einer Tabelle, um die Datenwerte anzugeben, die in einer oder mehreren Spalten akzeptabel sind.
Wenn eine Tabelle einen CHECK
hat einschränken, und Sie versuchen, Daten bereitzustellen, die nicht dem CHECK
entsprechen Beschränkung, schlägt der Vorgang mit einem Fehler fehl.
Dies hilft, die Datenintegrität aufrechtzuerhalten, da verhindert wird, dass ungültige Daten in die Datenbank gelangen.
Wenn Sie einen CHECK
erstellen Einschränkung stellen Sie einen logischen Ausdruck bereit, der TRUE
zurückgibt oder FALSE
. Dieser logische Ausdruck wird verwendet, um die Daten zu prüfen.
CHECK
Einschränkungen ähneln Fremdschlüsseleinschränkungen, da sie die Werte steuern, die in eine Spalte eingefügt werden. Der Unterschied besteht jedoch darin, wie sie bestimmen, welche Werte gültig sind:Foreign Key Constraints beziehen die Liste gültiger Werte aus einer anderen Tabelle, während CHECK
Constraints bestimmen die gültigen Werte aus einem logischen Ausdruck.
Einschränkungen können auf Spalten- oder Tabellenebene definiert werden. Eine Einschränkung auf Spaltenebene gilt nur für die Daten in dieser Spalte. Eine Einschränkung auf Tabellenebene gilt für die gesamte Zeile und prüft Daten aus mehreren Spalten.
Nachfolgend finden Sie Beispiele für die Erstellung von CHECK
sowohl auf Spaltenebene als auch auf Tabellenebene Einschränkungen.
Beispiel 1 – Erstellen Sie eine CHECK-Einschränkung auf Spaltenebene
Hier ist ein Beispiel für die Erstellung eines einfachen CHECK
auf Spaltenebene Einschränkung beim Erstellen einer Tabelle.
CREATE TABLE ConstraintTest ( ConstraintTestId int IDENTITY(1,1) NOT NULL PRIMARY KEY, Price smallmoney NOT NULL, CONSTRAINT chkPrice CHECK (Price > 0) );
In diesem Fall das CHECK
Einschränkung gibt an, dass alle Daten im Price
Spalte muss größer als 0 sein. Mit anderen Worten, der Preis kann nicht null und nicht negativ sein. Dies ist eine Einschränkung auf Spaltenebene, da sie für Daten in einer Spalte gilt.
Da dies eine Einschränkung auf Spaltenebene ist, hätte ich sie als Teil der Spalte definieren können (ohne Komma). Also hätte ich das tun können:
CREATE TABLE ConstraintTest ( ConstraintTestId int IDENTITY(1,1) NOT NULL PRIMARY KEY, Price smallmoney NOT NULL CONSTRAINT chkPrice CHECK (Price > 0) );
Versuchen wir in jedem Fall, einen ungültigen Wert einzufügen:
INSERT INTO ConstraintTest ( Price ) VALUES ( 0 );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'Price'.
Beispiel 2 – Fügen Sie weitere Spalten und eine weitere CHECK-Einschränkung auf Spaltenebene hinzu
Lassen Sie uns einige weitere Spalten zu unserer Tabelle hinzufügen und dann ein weiteres CHECK
auf Spaltenebene hinzufügen Einschränkung.
ALTER TABLE ConstraintTest ADD TeamSize tinyint NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, CONSTRAINT chkTeamSize CHECK (TeamSize >= 3 AND TeamSize <= 15) ;
Eine der neuen Spalten erfasst die Anzahl der Teammitglieder. In diesem Fall lautet die Geschäftsregel, dass ein Team mindestens 3, aber nicht mehr als 15 Mitglieder haben muss. Daher sollte die Datenbank verhindern, dass ein Team weniger als 3 Mitglieder oder mehr als 15 Mitglieder hat.
Versuchen wir, einen ungültigen Wert einzufügen:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 2, '2020-01-01', '1900-02-02' );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkTeamSize". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'TeamSize'.
Beispiel 3 – Hinzufügen einer CHECK-Einschränkung auf Tabellenebene
Lassen Sie uns nun eine Einschränkung auf Tabellenebene hinzufügen. Dadurch werden Daten in zwei Spalten geprüft.
Übrigens müssen Sie keine weitere Spalte hinzufügen, um einen CHECK
hinzuzufügen Zwang. Sie können die Einschränkung einfach selbst hinzufügen.
Beispiel:
ALTER TABLE ConstraintTest ADD CONSTRAINT chkValidEndDate CHECK (EndDate >= StartDate) ;
In diesem Fall füge ich eine Einschränkung hinzu, um sicherzustellen, dass das Enddatum niemals vor dem Startdatum liegen kann. Dies prüft Daten über zwei Spalten und ist daher eine Einschränkung auf Tabellenebene.
Versuchen Sie, einen ungültigen Wert einzufügen:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 3, '2020-01-01', '1900-02-02' );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkValidEndDate". The conflict occurred in database "Test", table "dbo.ConstraintTest".
Beachten Sie, dass ich zum Testen dieser Einschränkung die Teammitglieder auf 3 erhöhen musste, um zu verhindern, dass die vorherige Einschränkung zuerst ausgelöst wird (CHECK
Einschränkungen werden in der Reihenfolge ihrer Erstellung validiert).
Beispiel 4 – Ändern einer CHECK-Einschränkung
Sie können einen CHECK
nicht wirklich ändern Zwang. Wenn Sie es ändern müssen, müssen Sie es löschen und mit der neuen Definition erstellen.
Beispiel:
ALTER TABLE ConstraintTest DROP CONSTRAINT chkTeamSize; ALTER TABLE ConstraintTest ADD CONSTRAINT chkTeamSize CHECK (TeamSize >= 5 AND TeamSize <= 20) ;
Wie bereits erwähnt, CHECK
Einschränkungen werden in der Reihenfolge, in der sie erstellt werden, validiert, sodass dies beeinflussen kann, welcher Fehler zuerst abgefangen wird.
Wenn ich also in diesem Fall versuche, einen ungültigen Wert einzufügen (und auch ungültige Datumsangaben einschließe), werden die ungültigen Datumsangaben zuerst abgefangen:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 4, '2020-01-01', '1900-02-02' );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkValidEndDate". The conflict occurred in database "Test", table "dbo.ConstraintTest".
Um also meine letzte Einschränkung zu überprüfen, muss ich zuerst das Datumsproblem beheben:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 4, '2020-01-01', '2020-02-02' );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkTeamSize". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'TeamSize'.
Meine neueste Einschränkung funktioniert also wie erwartet.
Beispiel 5 – CHECK Constraints und IDENTITY-Spalten
Nachdem wir nun die Einschränkungen getestet haben, lasst uns fortfahren und gültige Daten einfügen:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 1, 5, '2020-01-01', '2020-02-02' );
Ergebnis:
+--------------------+---------+------------+-------------+------------+ | ConstraintTestId | Price | TeamSize | StartDate | EndDate | |--------------------+---------+------------+-------------+------------| | 13 | 1.0000 | 5 | 2020-01-01 | 2020-02-02 | +--------------------+---------+------------+-------------+------------+
Endlich bekommen wir eine gelungene Einfügung.
Sie werden jedoch feststellen, dass die IDENTITY
Spalte wurde bereits auf 13 erhöht.
Denken Sie daran, als ich zum ersten Mal die Tabelle erstellt habe, habe ich die ConstraintTestId
definiert Spalte, um IDENTITY(1,1)
zu verwenden , was bedeutet, dass sie bei 1 beginnen und bei jeder Zeileneinfügung automatisch um 1 erhöht werden sollte.
Aber jetzt, wo ich endlich meine erste Zeile eingefügt habe, ist der Wert bereits 13. Das liegt an der IDENTITY
Spalte wird auch bei einem CHECK
inkrementiert Einschränkung verursacht das INSERT
Vorgang fehlschlägt.
Beachten Sie, dass ich einige zusätzliche fehlgeschlagene Einfügungen vorgenommen habe, während ich die Beispiele für diesen Artikel erstellt habe, sodass der Wert auf einen höheren Wert gestiegen ist als der Wert, den Sie erhalten, wenn Sie diesem Artikel einfach Schritt für Schritt folgen.
Lassen Sie uns auf jeden Fall eine letzte fehlgeschlagene Einfügung durchführen und dann eine erfolgreiche, um dies zu bestätigen.
Einfügen fehlgeschlagen:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 2, 4, '2020-01-02', '2020-02-03' );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkTeamSize". The conflict occurred in database "Test", table "dbo.ConstraintTest", column 'TeamSize'.
Erfolgreiches Einfügen:
INSERT INTO ConstraintTest ( Price, TeamSize, StartDate, EndDate ) VALUES ( 2, 6, '2020-01-02', '2020-02-03' ); SELECT * FROM ConstraintTest;
Ergebnis:
+--------------------+---------+------------+-------------+------------+ | ConstraintTestId | Price | TeamSize | StartDate | EndDate | |--------------------+---------+------------+-------------+------------| | 13 | 1.0000 | 5 | 2020-01-01 | 2020-02-02 | | 15 | 2.0000 | 6 | 2020-01-02 | 2020-02-03 | +--------------------+---------+------------+-------------+------------+
Wir können sehen, dass die IDENTITY
Spalte springt von 13 auf 15, also hat sie sich offensichtlich während des fehlgeschlagenen Einfügens erhöht.
Einige Einschränkungen von CHECK-Constraints
Hier sind einige Einschränkungen, die Sie bei der Arbeit mit CHECK
beachten sollten Einschränkungen:
- Die Suchbedingung muss zu einem booleschen Ausdruck ausgewertet werden und darf nicht auf eine andere Tabelle verweisen.
- Der Ausdruck darf keine Alias-Datentypen enthalten.
CHECK
Beschränkungen können nicht für Text definiert werden , ntext , oder Bild Spalten.