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.