JavaRush /Курси /SQL SELF /Робота з обмеженням CHECK для перевірки дан...

Робота з обмеженням CHECK для перевірки даних

SQL SELF
Рівень 17 , Лекція 3
Відкрита

Обмеження CHECK — це, по суті, охоронець на вході твоєї таблиці. Воно гарантує, що дані, які ти додаєш у таблицю, відповідають певним умовам. Якщо передати в таблицю дані, які порушують ці умови, база даних відмовиться приймати такі дані.

Уяви, що ти хочеш відкрити магазин у Німеччині. Але за законом неділя — вихідний, і торгівля в цей день заборонена. Це обмеження — аналог CHECK у базі даних. Ти намагаєшся вказати розклад магазину: відкрито 7 днів на тиждень, але система одразу відповідає: "Nein, nein, неділя — це порушення. Такий графік не пройде перевірку!"

Так само і в базі даних: якщо ти задаєш значення, яке порушує правило CHECK, система блокує його, щоб не допустити "логічну помилку" в даних.

Навіщо потрібен CHECK?

  1. Підтримка якості даних: CHECK не дає потрапити в таблицю некоректній або нелогічній інформації.
  2. Зменшення ймовірності помилок: замість того щоб вручну перевіряти дані перед вставкою, ти можеш довірити цю задачу базі даних.
  3. Автономність логіки: правила перевірки можна вшити прямо в структуру бази даних, а не перекладати цю відповідальність на прикладний код.

Як працює CHECK?

Обмеження CHECK задається під час створення таблиці або може бути додане пізніше за допомогою команди ALTER TABLE. Ось базовий синтаксис:

CREATE TABLE таблиця (
    колонка тип_даних CHECK (умова)
);

умова — це логічний вираз, який має виконуватись для кожного значення у вказаному стовпці. Якщо умова порушується, база даних видає помилку.

Приклад 1: Перевірка діапазону значень

Давай створимо таблицю students, де вік студентів (age) має бути в межах від 16 до 100:

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

Тепер, якщо ти спробуєш вставити студента з віком 12, база даних тебе "зловить за руку":

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

Помилка:

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

Так, база даних тут — суворий привратник. Немає 16 — не лізь.

Приклад 2: Перевірка формату даних

Припустимо, у нас є таблиця emails, де зберігається список email-адрес. Ми хочемо впевнитися, що адреси містять символ @ (це спрощена перевірка):

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

Спробуємо додати некоректну адресу, яка не відповідає умові:

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

Помилка:

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

Помилки можна уникнути, якщо всі дані містять символ @:

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

Запит виконається успішно.

Приклад 3: Перевірка умов для кількох стовпців

Обмеження CHECK можуть перевіряти не лише один стовпець, а й логічний вираз, який залежить від кількох стовпців. Давай розглянемо приклад з таблицею employees, де зарплата (salary) має бути більшою, ніж бонуси (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)
);

Тепер, якщо хтось спробує додати працівника, у якого бонус більший за зарплату, база даних цього не дозволить:

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

Помилка:

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

Практичне застосування

Обмеження CHECK допомагає у випадках, коли твоя бізнес-логіка тісно пов’язана з обмеженнями на дані. Наприклад:

  1. Інтернет-магазини: заборона на додавання товарів з від’ємною ціною.
  2. Освітні платформи: перевірка віку учасників курсів.
  3. Медичні системи: впевненість, що температура тіла пацієнта лежить у допустимих межах.

Ці перевірки — не просто додатковий шар безпеки, вони економлять час і нерви розробників та користувачів.

Особливості та типові помилки

Коли працюєш з CHECK, враховуй такі моменти:

  • Логічні вирази у CHECK мають бути істинними для всіх рядків таблиці. Якщо хоча б один рядок порушує правило, перед додаванням обмеження цей рядок треба підправити.

  • Перевірка не буде виконуватись, якщо вставлене значення дорівнює NULL. Іншими словами, CHECK (age >= 18) не видасть помилку для age = NULL. Це тому, що будь-який вираз з NULL автоматично стає невизначеним. Якщо ти хочеш заборонити NULL, додай NOT NULL.

  • Складні умови у CHECK можуть погіршити продуктивність при вставці та оновленні даних, особливо у великих таблицях.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ