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

So erstellen Sie eine CHECK-Einschränkung in SQL Server (T-SQL-Beispiele)

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.