Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dodaj ograniczenie CHECK do istniejącej tabeli w SQL Server (T-SQL)

W tym artykule pokazano, jak dodać CHECK ograniczenie do istniejącej tabeli.

Możesz dodać ograniczenie do istniejącej tabeli, używając ALTER TABLE oświadczenie wraz z ADD CONSTRAINT argument. Przykłady poniżej.

Przykład 1 – Utwórz tabelę

Najpierw utwórzmy tabelę, do której dodamy znacznik CHECK ograniczenie.

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

Przykład 2 – Dodaj ograniczenie na poziomie kolumny

Teraz dodajmy CHECK ograniczenie do Ceny kolumna.

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

To ograniczenie zapewni, że cena będzie zawsze większa od zera.

Teraz, gdy ograniczenie zostało dodane, oto co się stanie, jeśli spróbujemy wstawić nieprawidłowe dane:

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

Wynik:

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

W takim przypadku CHECK ograniczenie określa, że ​​wszystkie dane w Price kolumna musi być większa niż 0. Innymi słowy, cena nie może być zero i nie może być ujemna.

Jest to określane jako ograniczenie na poziomie kolumny , ponieważ jest zdefiniowany w jednej kolumnie. Dotyczy danych w jednej kolumnie.

Przykład 3 – Dodaj ograniczenie na poziomie tabeli

Teraz dodajmy CHECK na poziomie tabeli ograniczenie. Spowoduje to sprawdzenie danych w dwóch kolumnach.

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

W tym przypadku dodaję ograniczenie, aby data zakończenia nigdy nie była wcześniejsza niż data rozpoczęcia. To sprawdzanie danych w dwóch kolumnach i dlatego jest ograniczeniem na poziomie tabeli.

Spróbuj wstawić nieprawidłową wartość:

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

Wynik:

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

Zgodnie z oczekiwaniami operacja kończy się niepowodzeniem, ponieważ moja data zakończenia jest wcześniejsza niż data rozpoczęcia.

Zwróć uwagę, że aby przetestować to ograniczenie, musiałem zwiększyć cenę do prawidłowej wartości, aby zapobiec uruchomieniu poprzedniego ograniczenia (CHECK ograniczenia są sprawdzane w kolejności ich tworzenia).

Przykład 4 – Pomyślne wstawianie danych zgodnych z ograniczeniem

Aby pomyślnie wstawić wiersz, wszystko, co musimy zrobić, to upewnić się, że wstawiamy prawidłowe wartości.

Przykład:

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

SELECT * FROM Event;

Wynik:

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

Zwróć uwagę, że Identyfikator zdarzenia kolumna już wzrosła do 4. Dzieje się tak, ponieważ jest to IDENTITY kolumna. Ważna rzecz do zapamiętania o IDENTITY kolumny polegają na tym, że zwiększają się, nawet gdy ograniczenie powoduje INSERT operacja zakończy się niepowodzeniem.

Niektóre ograniczenia ograniczeń wyboru

Oto kilka ograniczeń, o których należy pamiętać podczas pracy z CHECK ograniczenia:

  • Warunek wyszukiwania musi dać w wyniku wyrażenie logiczne i nie może odwoływać się do innej tabeli.
  • Wyrażenie nie może zawierać typów danych aliasów.
  • CHECK ograniczeń nie można zdefiniować w tekście , ntekst lub obraz kolumny.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepsze podejście do usuwania części czasu z datetime w SQL Server

  2. Dynamiczne tabele T-SQL i tabele temp

  3. Jak działa RANK() w SQL Server

  4. Konwertuj „datetime2” na „datetime” w SQL Server (przykłady T-SQL)

  5. Maksymalny rozmiar zapytania SQL Server? Klauzula IN? Czy istnieje lepsze podejście?