Зміна схеми бази даних за допомогою SQL

Інформація в реляційних базах даних зберігається у вигляді зв’язаних таблиць. Кожна таблиця має власну схему (структуру), яка включає назву таблиці та набір полів (атрибутів, колонок). Сукупність усіх схем таблиць становлять схему реляційної бази даних.
Для зміни існуючої схеми бази даних в мові SQL передбачені запити ALTER TABLE та DROP TABLE.
Запит на зміну структури таблиці має наступний вигляд:
ALTER TABLE таблиця
{ ADD [COLUMN] визначення_поля
| ALTER [COLUMN] назва_поля зміна_поля
| DROP [COLUMN] назва_поля [{RESTRICT|CASCADE}]
| ADD CONSTRAINT обмеження_таблиці
| DROP CONSTRAINT назва_обмеження [{RESTRICT|CASCADE}]
};

При зміні структури таблиці виконується одна з п’яти дій :

  • ADD [COLUMN] – додати нове поле (якщо в таблиці є записи, то нове поле не може бути обов’язковим – з обмеженням NOT NULL).
  • ALTER [COLUMN] – змінити існуюче поле.
  • DROP [COLUMN] – вилучити існуюче поле. Параметр RESTRICT означає, що якщо в базі даних існують посилання на поле (наприклад, у вигляді зовнішніх ключів), то при його вилученні виникне помилка. Параметр CASCADE забезпечує вилучення поля разом з усіма обмеженнями, що його стосуються.
  • ADD CONSTRAINT – додати нове обмеження цілісності.
  • DROP CONSTRAINT – вилучити існуюче обмеження цілісності. Параметри RESTRICT та CASCADE мають дію аналогічно, як у випадку вилучення поля.

При додаванні нового поля необхідно вказати його визначення (як для команди CREARTE TABLE).
визначення_поля ::=
назва_поля тип [обмеження_поля …] [DEFAULT значення_за_замовчуванням]

Назва_поля не повинна співпадати з назвами вже існуючих полів таблиці.
Для зміни властивостей поля необхідно вказати існуюче в таблиці поле та параметри зміни.
зміна_поля ::=
тип [{NULL | NOT NULL}] [{SET DEFAULT значення_за_замовчуванням | DROP DEFAULT}]

Змінювати можна розмірність полів (наприклад, з VARCHAR(30) на VARCHAR(50) або навпаки), причому, якщо розмірність зменшується, то можуть виникнути проблеми зі збереженням інформації більшої розмірності. Параметри NULL та NOT NULL означають відповідно встановлення необов’язковості та обов’язковості поля відповідно. Параметр SET DEFAULT встановлює нове значення за замовчуванням, а DROP DEFAULT – його вилучає.
Для вилучення поля з таблиці необхідно вказати назву існуючого поля.
Для створення нового обмеження необхідно вказати його у форматі обмеження для таблиці, а для вилучати обмеження цілісності можна лише по його назві (яка вказується після ключового слова CONSTRAINT).
Усі обмеження цілісності можна поділити на наступні типи:

  • Первинний ключ (PRIMARY KEY);
  • Унікальний ключ (UNIQUE);
  • Обмеження обов’язковості (NULL/NOT NULL);
  • Зовнішній ключ (FOREIGN KEY/REFERENCE);
  • Обмеження контролю значень (CHECK).

Обмеження цілісності можуть відноситись або до цілої таблиці (обмеження_таблиці) або до окремого поля (обмеження_поля). В якості обмежень_таблиці можуть служити усі обмеження крім обмежень обов’язковості.
обмеження_таблиці ::=
[CONSTRAINT назва_обмеження]
{PRIMARY KEY (поле,…)
| UNIQUE (поле,…)
| FOREIGN KEY (поле,…) REFERENCES таблиця[(поле,…)]
| CHECK (предикат)}

В якості обмежень_поля можуть служити усі без винятку обмеження цілісності.
обмеження_поля ::=
[CONSTRAINT назва_обмеження]
{NOT NULL
| PRIMARY KEY
| UNIQUE
| REFERENCES таблиця [(поле,…)]
| CHECK (предикат)}

Слід відзначити, що Microsoft Access не підтримує в SQL-запитах обмеження контролю значень (частина CHECK) . Крім того, ключове слово CONSTRAINT є обов’язковим для усіх обмежень крім обмежень обов’язковості (обмеження NOT NULL не вимагає ключового слова CONSTRAINT). Також Microsoft Access має певні обмеження щодо самої команди ALTER TABLE. В частині ALTER COLUMN не допускається керування значенням за замовчуванням. В частинах DROP COLUMN (CONSTRAINT) не допускаються параметри RESTRICT|CASCADE.
Для вилучення таблиці зі схеми бази даних в SQL існує команда DROP TABLE.
DROP TABLE назва_таблиці [{RESTRICT|CASCADE}];
Параметри RESTRICT|CASCADE мають таке ж значення, як в частинах DROP COLUMN (CONSTRAINT) для команди ALTER TABLE. Зауважимо, що ці параметри не підтримуються в Microsoft Access.
Розглянемо спроектовану за допомогою ER-діаграми схему бази даних (рис. 1).
Приклад ER-діаграми в нотації Баркера
Рис. 1. Приклад ER-діаграми в нотації Баркера.
Нехай відповідна база даних має наступну схему.

Сутність Схема
Предмет rf_course(id, name, recnote)
Тема rf_theme(id, course_id, lessontype, name, recnote)
Група rf_group(id, name, recnote)
Розклад dc_schedule(id, evdate, weektype, lessonnum, lessontype, course_id, group_id, recnote);
Заняття dc_lesson(id, evdate, lessonnum, course_id, group_id, recnote)

Для додавання в таблиці rf_course поля, яке б відображало тип предмету (гуманітарний чи точний), відповідна команда SQL матиме вигляд:
ALTER TABLE rf_course ADD coursetype VARCHAR(1)
CHECK (coursetype IN (‘h’,’e’));

В MS Access ця команда матиме вигляд:
ALTER TABLE rf_course ADD COLUMN coursetype CHARACTER(1);
Для збільшення розмірності поля name таблиці rf_theme до 250 символів команда SQL матиме вигляд:
ALTER TABLE rf_course ALTER name VARCHAR(250);
В MS Access ця команда матиме вигляд:
ALTER TABLE rf_course ALTER COLUMN name CHARACTER(250);
Для вилучення поля recnote з таблиці rf_group команда SQL матиме вигляд:
ALTER TABLE rf_course DROP recnote;
В MS Access ця команда матиме вигляд:
ALTER TABLE rf_course DROP COLUMN recnote;
Для додавання нового обмеження в таблиці dc_schedule, яке б відображало унікальність значень комбінації полів (evdate, weektype, lessonnum), команда SQL матиме вигляд:
ALTER TABLE dc_schedule ADD
CONSTRAINT dc_schedule_uk UNIQUE (evdate, weektype, lessonnum);

Для вилучення цього обмеження команда SQL матиме вигляд:
ALTER TABLE dc_schedule DROP CONSTRAINT dc_schedule_uk;
Для виконання запиту на зміну структури таблиці чи її вилучення в MS Access слід скористатися закладкою Queries вікна бази даних (рис. 2).
Закладка Queries вікна бази даних
Рис. 2. Закладка Queries вікна бази даних.
За допомогою кнопки New створюється новий запит (в діалоговому вікні, яке при цьому висвітлюється, слід вибирати Design View). При створенні нового запиту MS Access пропонує скористатися графічним конструктором запиту. Для переходу в режим SQL необхідно скористатися пунктом меню View/SQL View (Вигляд/Вигляд SQL). Наприклад, MS Access дозволяє варіант запиту як показано на рис. 3.
Запит на зміну існуючої таблиці
Рис. 3. Запит на зміну існуючої таблиці.
Для виконання запиту на зміну структури таблиці необхідно скористатися пунктом меню Query/Run (Запит/Виконати).