CodeGym /Kursy /SQL SELF /Praca z ograniczeniem CHECK do sprawdzania ...

Praca z ograniczeniem CHECK do sprawdzania danych

SQL SELF
Poziom 17 , Lekcja 3
Dostępny

Ograniczenie CHECK — to trochę taki ochroniarz przy wejściu do twojej tabeli. Gwarantuje, że dane, które wrzucasz do tabeli, spełniają określone warunki. Jeśli spróbujesz dodać dane, które łamią te zasady, baza danych po prostu ich nie przyjmie.

Wyobraź sobie, że chcesz otworzyć sklep w Niemczech. Ale według prawa niedziela to dzień wolny i handel wtedy jest zabroniony. To ograniczenie — to taki odpowiednik CHECK w bazie danych. Próbujesz ustawić grafik sklepu: otwarty 7 dni w tygodniu, ale system od razu odpowiada: "Nein, nein, niedziela — to naruszenie. Taki grafik nie przejdzie kontroli!"

Tak samo w bazie danych: jeśli podasz wartość, która łamie regułę CHECK, system ją zablokuje, żeby nie dopuścić do "błędu logicznego" w danych.

Po co jest CHECK?

  1. Wsparcie jakości danych: CHECK nie pozwala, żeby do tabeli trafiły niepoprawne albo nielogiczne dane.
  2. Mniej błędów: zamiast ręcznie sprawdzać dane przed wstawieniem, możesz zostawić to bazie danych.
  3. Autonomia logiki: reguły sprawdzania możesz wbudować w strukturę bazy, a nie przerzucać to na kod aplikacji.

Jak działa CHECK?

Ograniczenie CHECK ustalasz przy tworzeniu tabeli albo możesz dodać później przez ALTER TABLE. Oto podstawowa składnia:

CREATE TABLE tabela (
    kolumna typ_danych CHECK (warunek)
);

warunek — to wyrażenie logiczne, które musi być spełnione dla każdej wartości w danej kolumnie. Jeśli warunek jest złamany, baza danych wywali błąd.

Przykład 1: Sprawdzanie zakresu wartości

Stwórzmy tabelę students, gdzie wiek studentów (age) musi być w zakresie od 16 do 100:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age >= 16 AND age <= 100)
);

Teraz, jeśli spróbujesz dodać studenta w wieku 12 lat, baza danych "złapie cię za rękę":

INSERT INTO students (name, age)
VALUES ('Maria Chi', 12);

Błąd:

ERROR:  new row for relation "students" violates check constraint "students_age_check"
DETAIL:  Failing row contains (1, Maria Chi, 12).

No, baza danych tutaj — twardy bramkarz. Nie masz 16 lat — nie wchodzisz.

Przykład 2: Sprawdzanie formatu danych

Załóżmy, że mamy tabelę emails, gdzie trzymamy listę adresów e-mail. Chcemy się upewnić, że adresy mają znak @ (to taki uproszczony sposób sprawdzania):

CREATE TABLE emails (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) CHECK (email LIKE '%@%')
);

Spróbujmy dodać niepoprawny adres, który nie spełnia warunku:

INSERT INTO emails (email)
VALUES ('notanemail.com');

Błąd:

ERROR:  new row for relation "emails" violates check constraint "emails_email_check"
DETAIL:  Failing row contains (1, notanemail.com).

Błędu można uniknąć, jeśli wszystkie dane mają znak @:

INSERT INTO emails (email) 
VALUES ('example@student.com');

Zapytanie przejdzie bez problemu.

Przykład 3: Sprawdzanie warunków dla kilku kolumn

Ograniczenia CHECK mogą sprawdzać nie tylko jedną kolumnę, ale też wyrażenie logiczne zależne od kilku kolumn. Zobaczmy przykład z tabelą employees, gdzie pensja (salary) musi być większa niż bonus (bonus):

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    salary NUMERIC CHECK (salary > 0),
    bonus NUMERIC CHECK (bonus >= 0),
    CHECK (salary > bonus)
);

Teraz, jeśli ktoś spróbuje dodać pracownika, który ma bonus większy niż pensja, baza danych na to nie pozwoli:

INSERT INTO employees (name, salary, bonus)
VALUES ('Otto Lin', 3000, 4000);

Błąd:

ERROR:  new row for relation "employees" violates check constraint "employees_salary_bonus_check"
DETAIL:  Failing row contains (1, Otto Lin, 3000, 4000).

Zastosowanie w praktyce

Ograniczenie CHECK przydaje się tam, gdzie twoja logika biznesowa mocno wiąże się z ograniczeniami na dane. Na przykład:

  1. Sklepy internetowe: zakaz dodawania produktów z ujemną ceną.
  2. Platformy edukacyjne: sprawdzanie wieku uczestników kursów.
  3. Systemy medyczne: pewność, że temperatura ciała pacjenta mieści się w dozwolonym zakresie.

Te sprawdzenia — to nie tylko dodatkowa warstwa bezpieczeństwa, ale też oszczędność czasu i nerwów dla programistów i użytkowników.

Specyfika i typowe błędy

Gdy pracujesz z CHECK, pamiętaj o kilku rzeczach:

  • Wyrażenia logiczne w CHECK muszą być prawdziwe dla wszystkich wierszy tabeli. Jeśli choć jeden wiersz łamie regułę, przed dodaniem ograniczenia trzeba go poprawić.

  • Sprawdzanie nie będzie działać, jeśli wstawiana wartość to NULL. Innymi słowy, CHECK (age >= 18) nie wywali błędu dla age = NULL. To dlatego, że każde wyrażenie z NULL automatycznie staje się nieokreślone. Jeśli chcesz zabronić NULL, dodaj NOT NULL.

  • Składane warunki w CHECK mogą spowolnić wstawianie i aktualizację danych, zwłaszcza w dużych tabelach.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION