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.
CHECKBeschränkungen können nicht für Text definiert werden , ntext , oder Bild Spalten.