Введення обмежень в базах даних
В базі даних існують такі види обмежень:
- Первинний ключ — PRIMARY KEY.
- Унікальний ключ — UNIQUE KEY.
- Зовнішній ключ — FOREIGN KEY — може включати автоматичні тригери ON UPDATE і ON DELETE; перевірки — CHECK.
Обмеження бази даних бувають двох типів — на основі одного поля і на основі декількох полів таблиці. Давайте розглянемо створення обмежень детальніше. Першим в описі загального синтаксису обмежень йде ключове слово[CONSTRAINT <Ім'я обмеження>]. Тут CONSTRAINT означає обмеження. Як бачите, все це взяте в квадратні дужки і, значить, необов’язкове. В базі даних не може бути два обмеження з однаковими іменами.
За допомогою ключового слова CONSTRAINT можна задавати ім’я створюваному обмеженню і у випадку використання синтаксису обмежень на основі одного поля, і у випадку обмежень на основі декількох полів.
Якщо не вказати ім’я для обмеження, СУБД автоматично згенерує його. Однак краще все ж явно назначити ім’я, щоб покращити читабельність схеми бази даних і мати можливість, в подальшому, видалити його.
Призначивши ім’я обмеженню, необхідно задати його тип. Розглянемо різні типи обмежень.
Первинні ключі є одним з основних видів обмежень в базі даних. Вони використовуються для однозначної ідентифікації записів у таблиці. Первинний ключ являє собою одне або декілька полів в таблиці, комбінація яких унікальна для кожного запису. Для однієї таблиці не повинно існувати повторюваних значеннь первинного ключа.
Унікальні ключі мають аналогічне призначення — вони також використовуються для однозначної ідентифікації записів у таблиці. Відмінність первинних ключів від унікальних полягає в тому, що первинний ключ може бути в таблиці лише один, а унікальних ключів — декілька.
Синтаксис створення первинного і унікального ключа на основі єдиного поля такий:
[CONSTRAINT <Ім’я_обмеження>] {PRIMARY KEY|UNIQUE}
Приклад: створити таблицю Cars, яка в якості первинного ключа використовує поле типу INTEGER.
CREATE TABLE Cars
(kod INTEGER NOT NULL,
color VARCHAR(10),
year INTEGER,
price INTEGER,
displacement VARCHAR(10),
mileage VARCHAR(10),
CONSTRAINT PK_Kod PROMARY KEY(Kod));
Синтаксис створення первинного і унікального ключів на основі декількох полів:
[CONSTRAINT <Ім’я_обмеження>] {PRIMARY KEY|UNIQUE) (<стовпець1>[, <стовпець2>...] )
CREATE TABLE Cars
(kod INTEGER NOT NULL,
model VARCHAR(25) NOT NULL,
color VARCHAR(10),
year INTEGER,
price INTEGER,
displacement VARCHAR(10),
mileage VARCHAR(10),
CONSTRAINT PK_Kod PROMARY KEY(Kod, Model));
Зверніть увагу на те, що всі поля, які входять в склад первинного і унікального ключів, повинні декларуватися як NOT NULL, так як ці ключі не можуть містити порожніх значень.
Окрім створення обмежень первинних і унікальних ключів в момент створення таблиці існує можливість додавати обмеження в уже існуючу таблицю. Для цього використовується команда ALTER TABLE:
ALTER TABLE <Ім'я таблиці>
ADD [CONSTRAINT <Ім’я_обмеження>{PRIMARY KEY|UNIQUE)(<стовпець1> [, <стовпець2>...])
Наступним обмеженням, яке часто використовується в базах даних, є обмеження зовнішнього ключа. Воно також є обмеженням CONSTRAINT і відображає зв'язок між двома таблицями. Припустимо, що база даних autobazar складається з двох таблиць:
- Vendors - містить список людей, які являються продавцями автомобілів і складається з наступних полів: id (ключове поле), name.
- Cars — містить список автомобілів виставлених на продаж, яка складається з полів: Kod (ключове поле), v_id (зовнішній ключ для зв'язку з таблицею Vendors), color, year, price, displacement, mileage.
Отже скориставшись конструкцією CREATE TABLE створимо тадлицю Vendors, яка в якості первинного ключа використовує поле id типу INTEGER:
CREATE TABLE Vendors
(id INTEGER NOT NULL,
name VARCHAR(50),
CONSTRAINT PK_id PRIMARY KEY(id));
Таблицю Cars ми створили в попередньому прикладі, внесемо лише деякі зміни в її структурі (додамо поле v_id типу INTEGER, яке будемо використовувати в якості зовнішнього ключа.
ALTER TABLE Cars ADD v_id INTEGER NOT NULL;
ALTER TABLE Cars ADD CONSTRAINT FK_vid FOREIGN KEY(v_id) REFERENCES Vendors(id);
Останній SQL запит містить нове для на оголошення, а саме — оголошення зовнішнього ключа за допомогою оператора FOREIGN KEY. У дужках вказується поле таблиці, яке має бути пов'язане з іншою таблицею . Після цього йде ключове слово REFERENCES (посилання), ім'я таблиці, з якою повинен бути зв'язок (Vendors) і в дужках ім'я поля (id) .
І на кінець розглянемо одне з найбільш корисних обмежень в базі даних, а саме обмеження перевірки, яке має наступний синтаксис:
[CONSTRAINT <Ім’я_обмеження>] CHECK (<умова>)
Обмеження CHECK складається з ключового слова CHECK, після якого в дужках вказується умова, в якій використовується вказане поле. Будь-яка спроба модифікувати або вставити значення поля, яке призводить до не виконання даної умови, буде відхилена.
За допомогою обмеження CHECK і оператора LIKE можна легко домогтися введення даних у певному форматі. Наприклад, для поля mileage (пробіг) таблиці Cars дані потрібно представляти в наступному форматі «ХХХХХХ т. км», де Х — будь-які цифри. Даний формат можна представити таким чином:
ALTER TABLE Cars ADD CONSTRAINT c_mileage CHECK(mileage LIKE '______ т. км');
Також слід зазначити, що крім створення обмежень, доволі часто доводиться вилучати їх. Для цього оператор ALTER TABLE записують в наступному вигляді:
ALTER TABLE <Ім'я таблиці>
DROP CONSTRAINT <Ім’я_обмеження>
Зауваження: вилучати обмеження може лише власник таблиці або системний адміністратор SYSDBA.