#database
Exclusion Constraint це тип обмеження, який дозволяє вказати, що значення в стовпці або наборі стовпців не повинні перекриватися зі значеннями в іншому стовпці або наборі стовпців. Це корисно для дотримання бізнес-правил або забезпечення цілісності даних.
Наприклад, скажімо, у вас є таблиця, яка представляє календар, і ви хочете переконатися, що дві події не можуть бути заплановані одночасно. Ви можете додати до таблиці обмеження виключення, яке перевіряє час початку та завершення подій на наявність збігів.
CREATE EXTENSION IF NOT EXISTS "btree_gist";CREATE TABLE calendar ( id serial primary key, user_id integer not null, start_time timestamp without time zone, end_time timestamp without time zone, EXCLUDE USING gist (user_id with =, tsrange(start_time, end_time, '[)') with &&));У цьому прикладі ми використовуємо ключове слово
EXCLUDE для створення Exclusion Constraint, яке перевіряє наявність перекриття між стовпцями start_time, end_time та user_id. Вираз USING gist повідомляє PostgreSQL використовувати метод індексу Generalized Search Tree (GiST) для забезпечення обмеження. Для цього нам допоможе btree-gist.Після створення таблиці ми можемо вставляти в неї рядки, але будь-яка спроба вставити рядок, який порушує обмеження виключення, призведе до помилки. Приклад:
INSERT INTO calendar (user_id, start_time, end_time)VALUES (1, '2023-01-01 10:00:00', '2023-01-01 11:00:00');INSERT INTO calendar (user_id, start_time, end_time)VALUES (1, '2023-01-01 10:30:00', '2023-01-01 11:30:00');Варто зазначити, що Exclusion Constraint як і всякий сonstraint сповільнює вставку.