Обмеження CHECK — це, по суті, охоронець на вході твоєї таблиці. Воно гарантує, що дані, які ти додаєш у таблицю, відповідають певним умовам. Якщо передати в таблицю дані, які порушують ці умови, база даних відмовиться приймати такі дані.
Уяви, що ти хочеш відкрити магазин у Німеччині. Але за законом неділя — вихідний, і торгівля в цей день заборонена. Це обмеження — аналог CHECK у базі даних. Ти намагаєшся вказати розклад магазину: відкрито 7 днів на тиждень, але система одразу відповідає: "Nein, nein, неділя — це порушення. Такий графік не пройде перевірку!"
Так само і в базі даних: якщо ти задаєш значення, яке порушує правило CHECK, система блокує його, щоб не допустити "логічну помилку" в даних.
Навіщо потрібен CHECK?
- Підтримка якості даних:
CHECKне дає потрапити в таблицю некоректній або нелогічній інформації. - Зменшення ймовірності помилок: замість того щоб вручну перевіряти дані перед вставкою, ти можеш довірити цю задачу базі даних.
- Автономність логіки: правила перевірки можна вшити прямо в структуру бази даних, а не перекладати цю відповідальність на прикладний код.
Як працює 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 допомагає у випадках, коли твоя бізнес-логіка тісно пов’язана з обмеженнями на дані. Наприклад:
- Інтернет-магазини: заборона на додавання товарів з від’ємною ціною.
- Освітні платформи: перевірка віку учасників курсів.
- Медичні системи: впевненість, що температура тіла пацієнта лежить у допустимих межах.
Ці перевірки — не просто додатковий шар безпеки, вони економлять час і нерви розробників та користувачів.
Особливості та типові помилки
Коли працюєш з CHECK, враховуй такі моменти:
Логічні вирази у
CHECKмають бути істинними для всіх рядків таблиці. Якщо хоча б один рядок порушує правило, перед додаванням обмеження цей рядок треба підправити.Перевірка не буде виконуватись, якщо вставлене значення дорівнює
NULL. Іншими словами,CHECK (age >= 18)не видасть помилку дляage = NULL. Це тому, що будь-який вираз зNULLавтоматично стає невизначеним. Якщо ти хочеш заборонитиNULL, додайNOT NULL.Складні умови у
CHECKможуть погіршити продуктивність при вставці та оновленні даних, особливо у великих таблицях.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ