Sprawdź ograniczenie
Ograniczenie sprawdzające jest typem ograniczenia integralności w języku SQL , które określa wymagania, które muszą być spełnione przez każdy wiersz w tabeli bazy danych . Ograniczenie musi być predykatem . Może odnosić się do pojedynczej kolumny lub wielu kolumn tabeli. Wynikiem predykatu może być PRAWDA
, FAŁSZ
lub NIEZNANY
, w zależności od obecności wartości NULL . Jeśli predykat ma wartość UNKNOWN
, wówczas ograniczenie nie jest naruszone i wiersz można wstawić lub zaktualizować w tabeli. Jest to sprzeczne z predykatami w WHERE
w instrukcjach SELECT
lub UPDATE
.
Na przykład w tabeli zawierającej produkty można dodać ograniczenie sprawdzające, tak aby cena produktu i ilość produktu były wartościami nieujemnymi:
CENA >= 0
ILOŚĆ >= 0
Gdyby te ograniczenia nie istniały, możliwa byłaby ujemna cena (-30 USD) lub ilość (-3 sztuki).
Ograniczenia sprawdzające służą do zapewnienia poprawności danych w bazie danych i zapewnienia integralności danych . Jeśli są używane na poziomie bazy danych, aplikacje korzystające z bazy danych nie będą mogły dodawać nieprawidłowych danych ani modyfikować prawidłowych danych, tak aby dane stały się nieważne, nawet jeśli sama aplikacja zaakceptuje nieprawidłowe dane.
Definicja
Każde ograniczenie sprawdzające musi być zdefiniowane w instrukcji CREATE TABLE
lub ALTER TABLE
przy użyciu składni:
CREATE TABLE nazwa_tabeli ( ..., CONSTRAINT nazwa_ograniczenia SPRAWDŹ ( predykat ), ... )
ALTER TABLE nazwa_tabeli ADD CONSTRAINT nazwa_ograniczenia SPRAWDŹ ( predykat )
Jeśli ograniczenie sprawdzające odnosi się tylko do pojedynczej kolumny, możliwe jest określenie ograniczenia jako części definicji kolumny.
UTWÓRZ TABELĘ nazwa_tabeli ( ... nazwa_kolumny typ CHECK ( predykat ), ... )
NIE NULL ograniczenie
Ograniczenie NOT NULL
jest funkcjonalnie równoważne następującemu ograniczeniu sprawdzającemu z predykatem IS NOT NULL
:
SPRAWDŹ ( kolumna NIE JEST NULL)
Niektóre systemy zarządzania relacyjnymi bazami danych są w stanie zoptymalizować wydajność, gdy używana jest składnia ograniczenia NOT NULL
w przeciwieństwie do składni ograniczenia CHECK
podanej powyżej.
Wspólne ograniczenia
Większość systemów zarządzania bazami danych ogranicza ograniczenia sprawdzania do pojedynczego wiersza, z dostępem do stałych i funkcji deterministycznych, ale nie do danych w innych tabelach lub danych niewidocznych dla bieżącej transakcji z powodu izolacji transakcji .
Takie ograniczenia nie są tak naprawdę ograniczeniami sprawdzania tabeli , ale raczej ograniczeniami sprawdzania wierszy . Ponieważ te ograniczenia są zazwyczaj weryfikowane tylko wtedy, gdy wiersz jest bezpośrednio aktualizowany (ze względu na wydajność) i często implementowane jako dorozumiane wyzwalacze INSERT
lub UPDATE ,
ograniczenia integralności mogłyby zostać naruszone przez działanie pośrednie, gdyby nie te ograniczenia. Ponadto ograniczenie CHECK
uniemożliwiłoby modyfikacje tych rekordów, które w innym przypadku byłyby ważne . Niektóre przykłady niebezpiecznych ograniczeń obejmują:
SPRAWDŹ (( wybierz liczbę ( * ) z faktur , gdzie faktury . identyfikator klienta = identyfikator klienta ) < 1000 )
SPRAWDŹ ( wstawiona data = CURRENT_DATE )
SPRAWDŹ ( liczba elementów = LOS ())
Do obejścia tych ograniczeń można użyć wyzwalaczy zdefiniowanych przez użytkownika . Chociaż implementacja jest podobna, semantycznie jasne jest, że wyzwalacze będą uruchamiane tylko wtedy, gdy tabela zostanie bezpośrednio zmodyfikowana, a projektant jest odpowiedzialny za obsługę pośrednich, ważnych zmian w innych tabelach; ograniczenia z drugiej strony mają być „prawdziwe przez cały czas”, niezależnie od działań użytkownika lub braku przewidywania projektanta.
- ^ Dokumentacja PostgreSQL 13, rozdział 5. Definicja danych , sekcja 5.4.2. Not-Null Constraints , Witryna internetowa: https://www.postgresql.org/docs/13/ddl-constraints.html , Dostęp 9 stycznia 2021 r.