sql >> Databasteknik >  >> RDS >> Sqlserver

Lägg till en CHECK-begränsning till en befintlig tabell i SQL Server (T-SQL)

Den här artikeln visar hur man lägger till en CHECK begränsning till en befintlig tabell.

Du kan lägga till en begränsning till en befintlig tabell genom att använda ALTER TABLE sats tillsammans med ADD CONSTRAINT argument. Exempel nedan.

Exempel 1 – Skapa tabellen

Låt oss först skapa en tabell som vi lägger till CHECK för 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
);

Exempel 2 – Lägg till en begränsning på kolumnnivå

Låt oss nu lägga till en CHECK begränsning till Pris kolumn.

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

Denna begränsning säkerställer att priset alltid är högre än noll.

Nu när begränsningen har lagts till, här är vad som händer om vi försöker infoga ogiltiga 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 det här fallet, CHECK begränsning anger att all data i Price kolumnen måste vara större än 0. Med andra ord kan priset inte vara noll och det får inte vara negativt.

Detta kallas för en restriktion på kolumnnivå , eftersom den är definierad i en enda kolumn. Det gäller data i en kolumn.

Exempel 3 – Lägg till en begränsning på tabellnivå

Låt oss nu lägga till en CHECK på tabellnivå begränsning. Detta kommer att kontrollera data i två kolumner.

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

I det här fallet lägger jag till en begränsning för att säkerställa att slutdatumet aldrig kan vara tidigare än startdatumet. Detta kontrollerar data över två kolumner och är därför en begränsning på tabellnivå.

Försök att infoga ett ogiltigt värde:

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 väntat misslyckas operationen eftersom mitt slutdatum är tidigare än startdatumet.

Observera att för att testa denna begränsning var jag tvungen att höja priset till ett giltigt värde för att förhindra att den tidigare begränsningen utlöses först (CHECK begränsningar valideras i den ordning de skapas).

Exempel 4 – framgångsrikt infoga data som överensstämmer med begränsningen

För att lyckas infoga en rad behöver vi bara se till att vi infogar giltiga värden.

Exempel:

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 |
+-----------+-------------+-------------+------------+----------+

Observera att EventId kolumnen har redan ökat till 4. Detta beror på att det är en IDENTITY kolumn. En viktig sak att komma ihåg om IDENTITY kolumner är att de ökar även när en begränsning orsakar en INSERT operation misslyckas.

Några begränsningar av CHECK-begränsningar

Här är några begränsningar att tänka på när du arbetar med CHECK begränsningar:

  • Sökvillkoret måste utvärderas till ett booleskt uttryck och kan inte referera till en annan tabell.
  • Uttrycket kan inte innehålla aliasdatatyper.
  • CHECK begränsningar kan inte definieras på text , ntext , eller bild kolumner.

  1. PostgreSQL Connection Pooling med PgBouncer

  2. Kontrollera och optimera MySQL-databasen automatiskt med Crontab/Cron

  3. Skapa tabell (struktur) från befintlig tabell

  4. Hur UNION fungerar i PostgreSQL