sql >> Database teknologi >  >> RDS >> Sqlserver

Tilføj en CHECK-begrænsning til en eksisterende tabel i SQL Server (T-SQL)

Denne artikel viser, hvordan du tilføjer en CHECK begrænsning til en eksisterende tabel.

Du kan tilføje en begrænsning til en eksisterende tabel ved at bruge ALTER TABLE sætning sammen med ADD CONSTRAINT argument. Eksempler nedenfor.

Eksempel 1 – Opret tabellen

Lad os først oprette en tabel, som vi tilføjer CHECK til begrænsning.

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
);

Eksempel 2 – Tilføj en begrænsning på kolonneniveau

Lad os nu tilføje en CHECK begrænsning til Pris kolonne.

ALTER TABLE Event
  ADD CONSTRAINT chkPrice CHECK (Price > 0);

Denne begrænsning vil sikre, at prisen altid er større end nul.

Nu hvor begrænsningen er blevet tilføjet, sker der her, hvis vi forsøger at indsætte ugyldige data:

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 0 );

Resultat:

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'.

I dette tilfælde er CHECK begrænsning angiver, at alle data i Price kolonne skal være større end 0. Med andre ord kan prisen ikke være nul, og den kan ikke være negativ.

Dette omtales som en restriktion på kolonneniveau , fordi det er defineret på en enkelt kolonne. Det gælder for data i én kolonne.

Eksempel 3 – Tilføj en begrænsning på tabelniveau

Lad os nu tilføje en CHECK på tabelniveau begrænsning. Dette vil kontrollere data i to kolonner.

ALTER TABLE Event
  ADD CONSTRAINT chkEndDate 
  CHECK (EndDate >= StartDate);

I dette tilfælde tilføjer jeg en begrænsning for at sikre, at slutdatoen aldrig kan være tidligere end startdatoen. Dette kontrollerer data på tværs af to kolonner og er derfor en begrænsning på tabelniveau.

Prøv at indsætte en ugyldig værdi:

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '1970-02-02', 150.00 );

Resultat:

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".

Som forventet mislykkes handlingen, fordi min slutdato er tidligere end startdatoen.

Bemærk, at for at teste denne begrænsning, var jeg nødt til at øge prisen til en gyldig værdi for at forhindre den tidligere begrænsning i at blive udløst først (CHECK begrænsninger valideres i den rækkefølge, de oprettes).

Eksempel 4 – Indsættelse af data, der er i overensstemmelse med begrænsningen

For at kunne indsætte en række, skal vi bare sørge for, at vi indsætter gyldige værdier.

Eksempel:

INSERT INTO Event ( EventName, StartDate, EndDate, Price )
VALUES ( 'ICCC 2020', '2020-01-01', '2020-02-02', 150.00 );

SELECT * FROM Event;

Resultat:

+-----------+-------------+-------------+------------+----------+
| EventId   | EventName   | StartDate   | EndDate    | Price    |
|-----------+-------------+-------------+------------+----------|
| 4         | ICCC 2020   | 2020-01-01  | 2020-02-02 | 150.0000 |
+-----------+-------------+-------------+------------+----------+

Bemærk, at EventId kolonne er allerede steget til 4. Dette skyldes, at det er en IDENTITY kolonne. En vigtig ting at huske om IDENTITY kolonner er, at de stiger, selv når en begrænsning forårsager en INSERT operation mislykkes.

Nogle begrænsninger af CHECK-begrænsninger

Her er et par begrænsninger, du skal være opmærksom på, når du arbejder med CHECK begrænsninger:

  • Søgebetingelsen skal evalueres til et boolesk udtryk og kan ikke henvise til en anden tabel.
  • Udtrykket kan ikke indeholde aliasdatatyper.
  • CHECK begrænsninger kan ikke defineres på tekst , ntekst eller billede kolonner.

  1. SQL Server-fejl 213:Kolonnenavnet eller antallet af angivne værdier matcher ikke tabeldefinitionen.

  2. CRS 11.2.0

  3. Vis alle forespørgsler, der kommer til en Oracle-database

  4. Find 2. højeste løn bedst mulige måder