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

CHECK-Einschränkungen in SQL Server

In diesem Artikel werden wir über CHECK-Einschränkungen sprechen. Wir werden sehen, wie man SQL Server-Tabellenspalten CHECK-Einschränkungen hinzufügt, und die Fallstricke besprechen, auf die Sie stoßen können, wenn Sie diese Art von SQL Server-Einschränkungen verwenden.

PRÜFEN Sie die Grundlagen der Einschränkung

CHECK-Einschränkungen sind einfach bedingte Anweisungen (Prädikate, die TRUE oder FALSE zurückgeben), die sich auf Tabellenspalten beziehen, um die Datenintegrität aufrechtzuerhalten. Wenn man Daten in eine Spalte oder mehrere Spalten in einer einzelnen Zeile einfügt, treten CHECK-Einschränkungen in Kraft. Sie werten die einzufügenden Daten aus. Falls die Daten die in der CHECK-Einschränkung angegebene Bedingung nicht erfüllen, schlägt das Einfügen fehl.

Betrachten Sie das folgende Beispiel:

Es ist erforderlich, eine Einschränkung für die Gehaltsspalte festzulegen, sodass nur positive Werte gespeichert werden, die 150.000 $ nicht überschreiten. Die bedingte Anweisung sieht wie folgt aus:(Gehalt>=0 und Gehalt <=150000). Beim Versuch, negative Werte einzufügen, ergibt das Prädikat FALSE und die Einfügung schlägt fehl.

Es ist möglich, einer einzelnen oder mehreren Spalten eine CHECK-Einschränkung hinzuzufügen. Das Hinzufügen einer mehrspaltigen CHECK-Einschränkung kann auf Tabellenebene implementiert werden.

Mit CHECK-Einschränkungen arbeiten

Erstellen von CHECK-Einschränkungen in SSMS

  1. Im Objekt-Explorer , navigieren Sie zu einer erforderlichen Tabelle.

  2. Klicken Sie mit der rechten Maustaste auf die Einschränkungen Ordner und dann c Klicken Sie auf Neue Einschränkung…

  3. Im rechten Bereich der Check Constraints Klicken Sie im Dialogfeld auf Ausdruck und klicken Sie dann auf die Schaltfläche mit den Auslassungspunkten.

  1. Geben Sie einen CHECK-Einschränkungsausdruck in das Textfeld des Check-Einschränkungsausdrucks ein Dialogbox. Um beispielsweise nur siebenstellige Postleitzahlen in einer PLZ-Spalte zuzulassen, kann der Ausdruck wie folgt aussehen:

Im Tabellen-Designer Abschnitt können Sie die Regeln einrichten, um die Einschränkung durchzusetzen.

PRÜFEN Sie die Einschränkung bei CREATE TABLE

Betrachten Sie das folgende Beispiel:

Es ist erforderlich, eine Tabelle zu erstellen, die Daten über Bankkunden speichert, und sie mit Testdaten zu füllen. Die Tabelle enthält die folgenden Spalten:Kunden-ID, Vorname, Nachname, Status, Telefon, Stadt, Bundesland und Postleitzahl.

Beim Entwickeln der Tabelle müssen wir die folgenden Tatsachen berücksichtigen:

  1. Das grundlegende ZIP-Format besteht aus fünf Ziffern.

  2. Die amerikanische Standardtelefonnummer ist zehnstellig, z. B. (555) 555-1234

  3. Zwei-Buchstaben-Abkürzungen werden verwendet, um die politischen Abteilungen der Vereinigten Staaten für Postanschriften, Datenverarbeitung, allgemeine Abkürzungen und andere Zwecke darzustellen.

Die Aufgabe besteht darin, Datenkonsistenz für die Tabelle bereitzustellen. Es ist erforderlich, das Einfügen von 12-stelligen Telefonnummern und 6-stelligen Postleitzahlen usw. zu verbieten. Dazu erlaubt uns SQL Server, eine oder mehrere CHECK-Einschränkungen für jede Tabellenspalte hinzuzufügen.

Im vorherigen Abschnitt haben wir die eine Möglichkeit zum Erstellen einer CHECK-Einschränkung in SSMS untersucht. Nun werden wir besprechen, wie die Einschränkung mit Hilfe von T-SQL erstellt wird.

Das folgende Skript zeigt, wie eine CHECK-Einschränkung für die Zip-Spalte erstellt wird:

CREATE TABLE Customers
(
 Customer_Id tinyint NOT NULL,
 [First Name] varchar(50),
 [Last Name] varchar(50),
 Status varchar(50),
 Phone tinyint,
 Address varchar(50),
 State varchar(50),
 Zip tinyint,
 Email varchar(50),
 [Credit Limit] INT NULL,
 CONSTRAINT CK_Zip CHECK (Zip LIKE REPLICATE ('[0-9]', 5)) --Check Constraint Condition
)

Sehen wir uns nun an, was wir bekommen, wenn wir versuchen, einen 6-stelligen Wert in die Zip-Spalte einzufügen:

INSERT INTO dbo.Customers (Customer_Id, [First Name], [Last Name], Status, Phone, Address, State, Zip, Email)
SELECT 1, 'James', 'Madison', 'Mr', 555-555-1234, 'Madison street, 12', 'LA', 123456, NULL
GO

Das Einfügen schlägt fehl, und SQL Server zeigt die folgende Verhinderung an:

So weit, so gut.

CASE-Ausdruck in CHECK-Einschränkung

Nehmen Sie an, dass die Bank eine Geschäftsregel hat, um das Kreditlimit für die Einwohner des Bundesstaates Louisiana auf unter 150.000 $ festzulegen. Wir werden diese Anforderung implementieren, indem wir der Spalte „Kreditlimit“ eine CHECK-Einschränkung hinzufügen:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (State='LA' AND [Credit Limit] <= 150000)
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (1, 'James Black', 'Mr', 5558787, 'LA', 46853, '[email protected]', 120000);
GO

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (2, 'Mark Spencer', 'Mr', 3332244, 'NY', 23487, '[email protected]', 200000);
GO

Wenn wir die obige Anweisung ausführen, erhalten wir den folgenden Fehler:

Die INSERT-Anweisung steht in Konflikt mit der CHECK-Einschränkung. Was ist schief gelaufen?

Sehen wir uns die Abfrage genauer an. Beachten Sie, dass die CHECK-Einschränkung nur die „LA“-Werte für die State-Spalte zulässt. Gleichzeitig dürfen die Werte in der Spalte Credit 150000 nicht überschreiten.

In ähnlicher Weise würde die CHECK-Einschränkung das Schreiben anderer Statuscodes in die Spalte nicht zulassen.

Daher müssen wir die Bedingung ändern. Gemäß der Geschäftslogik stellt die Bank 150.000 $ des Kreditlimits für Einwohner von Louisiana bereit. Gleichzeitig kann dieser Wert für andere Einwohner abweichen.

Um diesen Fall zu implementieren, verwenden wir die CASE-Klausel innerhalb der CHECK-Einschränkung:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Credit_Limit
CHECK (CASE WHEN State='LA' AND [Credit Limit] <= 150000 THEN 1 ELSE 0 END = 1)
GO

Dieser Ausdruck entspricht vollständig der Geschäftslogik.

NULL-Werte in CHECK-Einschränkung

Die Bank unterteilt ihre Kunden in Segmente. Die Spalte Status enthält die Daten, die bestimmen, ob ein Kunde VIP oder Stammkunde ist. Die maximale Höhe des Kreditlimits für Stammkunden beträgt 200.000 USD. Die VIPs können auf 500.000 $ zurückgreifen.

Die CHECK-Einschränkung kann wie folgt aussehen:

ALTER TABLE dbo.Customers
ADD CONSTRAINT CK_Status_Credit_Limit
CHECK (Status = 'VIP' OR Status = 'Regular')
GO

Beachten Sie, dass die CHECK-Einschränkung das Einfügen von NULL-Werten in die State-Spalte erlaubt (vorausgesetzt, dass keine NOT NULL-Einschränkung explizit definiert ist). Die CHECK-Einschränkung wertet die Werte aus und gibt TRUE oder FALSE zurück. Es wertet NULL als UNBEKANNT aus. Daher verursachen NULL-Werte keine Fehler. Dies steht im Gegensatz zu Prädikaten in WHERE-Klauseln in SELECT- oder UPDATE-Anweisungen.

CHECK und NOCHECK

Von Zeit zu Zeit ändert sich die Geschäftslogik. Es verursacht Änderungen an Datenbankobjekten. Stellen Sie sich vor, ein Land erweitert die Postleitzahlenbasis und fügt 6-stellige Werte hinzu.

Die alten 5-stelligen Werte werden den Bereichen nicht mehr zugeordnet. Sie gelten jedoch weiterhin für bestehende. Daher muss die CHECK-Einschränkung die vorhandenen Daten im alten Format berücksichtigen und Daten im neuen Format validieren.

Die NOCHECK-Klausel löst dieses Problem:

ALTER TABLE Customers WITH NOCHECK
ADD CONSTRAINT CK_Zip_Code
CHECK (Zip LIKE REPLICATE('[0-9]', 6));
GO

Die folgende Einfügung ist erfolgreich:

INSERT INTO Customers (Customer_Id, Name, Status, Phone, State, Zip, Email, [Credit Limit])
VALUES (102, 'Jake Harrison', 'VIP', 555-555-1234, 'NY', 123456, '[email protected]', 100000);
GO

Beim Versuch, eine fünfstellige Postleitzahl einzufügen, gibt die Engine den Fehler aus:

DBCC-PRÜFEINSCHRÄNKUNGEN

SQL Server stellt DBCC CHECKCONSTRAINTS bereit, um nach Daten zu suchen, die nicht den Einschränkungen entsprechen.

Wenn es ein Problem mit der Datenbankintegrität gibt, führen Sie DBCC CHECKCONSTRAINTS für die gesamte Datenbank aus, um sicherzustellen, dass es keine Probleme gibt.

Beachten Sie, dass dieser Befehl die Leistung beeinflusst. Daher sollte es nicht regelmäßig ausgeführt werden.

Es ist möglich, DBCC CHECKCONSTRAINTS für eine einzelne Einschränkung, eine Tabelle oder die gesamte Datenbank auszuführen.

Im Vergleich zu anderen Prüfbefehlen nimmt DBCC CHECKCONSTRAINTS viel Zeit in Anspruch und verbraucht Systemressourcen. Im Gegensatz zu anderen Befehlen verwendet CHECKCONSTRAINTS keinen Datenbank-Snapshot.

Schlussfolgerung

CHECK-Einschränkungen stellen den Mechanismus zum Auswerten von Daten vor dem Einfügen bereit. CHECK-Einschränkungen können sich auf eine einzelne Spalte oder mehrere Tabellenspalten beziehen.

Einschränkungen sind einfach Prädikate, die WAHR, FALSCH oder UNBEKANNT ergeben. Falls NULL in eine Tabelle eingefügt wird, wird eine Beschränkung nicht verletzt.