Dieser Artikel zeigt, wie ein CHECK
hinzugefügt wird Beschränkung auf eine vorhandene Tabelle.
Sie können einer bestehenden Tabelle eine Einschränkung hinzufügen, indem Sie ALTER TABLE
verwenden -Anweisung zusammen mit der ADD CONSTRAINT
Streit. Beispiele unten.
Beispiel 1 – Erstellen Sie die Tabelle
Lassen Sie uns zunächst eine Tabelle erstellen, für die wir den CHECK
hinzufügen Einschränkung.
CREATE TABLE Event ( EventId int IDENTITY(1,1) NOT NULL PRIMARY KEY, EventName varchar(255) NOT NULL, StartDate date NOT NULL, EndDate date NOT NULL, Price smallmoney NOT NULL );
Beispiel 2 – Fügen Sie eine Beschränkung auf Spaltenebene hinzu
Jetzt fügen wir ein CHECK
hinzu Beschränkung auf den
Preis
Spalte.
ALTER TABLE Event ADD CONSTRAINT chkPrice CHECK (Price > 0);
Diese Einschränkung stellt sicher, dass der Preis immer größer als Null ist.
Nachdem die Einschränkung hinzugefügt wurde, passiert Folgendes, wenn wir versuchen, ungültige Daten einzufügen:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkPrice". The conflict occurred in database "EMS", table "dbo.Event", column 'Price'.
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 wird als Einschränkung auf Spaltenebene bezeichnet , da es in einer einzelnen Spalte definiert ist. Es gilt für Daten in einer Spalte.
Beispiel 3 – Hinzufügen einer Einschränkung auf Tabellenebene
Lassen Sie uns nun einen CHECK
auf Tabellenebene hinzufügen Zwang. Dadurch werden Daten in zwei Spalten geprüft.
ALTER TABLE Event ADD CONSTRAINT chkEndDate 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 Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );
Ergebnis:
Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "chkEndDate". The conflict occurred in database "EMS", table "dbo.Event".aufgetreten
Wie erwartet schlägt der Vorgang fehl, da mein Enddatum vor dem Startdatum liegt.
Beachten Sie, dass ich zum Testen dieser Einschränkung den Preis auf einen gültigen Wert 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 – Erfolgreiches Einfügen von Daten, die der Einschränkung entsprechen
Um eine Zeile erfolgreich einzufügen, müssen wir nur sicherstellen, dass wir gültige Werte einfügen.
Beispiel:
INSERT INTO Event ( EventName, StartDate, EndDate, Price ) VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 ); SELECT * FROM Event;
Ergebnis:
+-----------+-------------+-------------+------------+----------+ | EventId | EventName | StartDate | EndDate | Price | |-----------+-------------+-------------+------------+----------| | 4 | ICCC 2020 | 2020-01-01 | 2020-02-02 | 150.0000 | +-----------+-------------+-------------+------------+----------+
Beachten Sie, dass die
EventId
Spalte bereits auf 4 erhöht wurde. Dies liegt daran, dass es sich um eine IDENTITY
handelt Säule. Eine wichtige Sache, die Sie sich über IDENTITY
merken sollten Spalten ist, dass sie auch dann inkrementieren, wenn eine Einschränkung ein INSERT
verursacht Vorgang fehlschlägt.
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.