Новости
У цій замітці ми навчимося створювати зв'язки між таблицями в базі даних MySQL за допомогою phpmyadmin. Якщо з якоїсь причини ви не бажаєте використовувати phpmyadmin, дивіться наведені нижче SQL-запити.
Чому ж зв'язку зручно тримати в самій базі даних? Адже це завдання зазвичай вирішує так і сам додаток? Вся справа в обмеженнях і діях при зміні, які можна накласти на зв'язку.
Наприклад, можна заборонити видаляти категорію, якщо з нею пов'язана хоча б одна замітка. Або видалити всі нотатки, якщо видалена категорія. Або встановити NULL в сполучна поле. У будь-якому випадку, за допомогою зв'язків підвищується відмовостійкість і надійність програми.
Для початку, движок таблиць повинен бути InnoDB. Тільки він підтримує зовнішні ключі (foreign key). Якщо у вас таблиці MyISAM, почитайте як їх конвертувати в InnoDB .
Для того, щоб зв'язати таблиці по полях, необхідно спочатку додати в індекс зв'язуються поля:
У phpmyadmin вибираємо таблицю, вибираємо режим структури, виділяємо поле, для якого будемо робити зовнішній зв'язок і натискаємо Індекс.
Зверніть увагу на різницю між "Індекс" і "Унікальний". Унікальний індекс можна використовувати, наприклад, до поля id, тобто там, де значення не повторюються.
Це ж дію можна зробити за допомогою SQL-запит:
ALTER TABLE `table_name` ADD INDEX (` field_name`);
Аналогічно додаємо індекс (тільки в моєму випадку тепер уже унікальний або первинний) для таблиці, на яку посилаємося, для поля id. Оскільки поле id у мене ідентифікатор, для нього робимо первинний ключ. Унікальний ключ міг би знадобиться для інших унікальних полів.
За допомогою SQL-запит:
ALTER TABLE `table_name` ADD UNIQUE (` field_name`);
Тепер залишилося тільки зв'язати таблиці. Для цього натискаємо внизу на пункт Зв'язки:
Тепер для доступних полів (а доступні тільки проіндексовані поля) вибираємо зв'язок із зовнішніми таблицями і дії при зміні записів в таблицях:
Через SQL-запит:
ALTER TABLE `table_name` ADD FOREIGN KEY (` field_in_table_name_which_need_connect`) REFERENCES `outer_table_to_connect` (` outer_field`) ON DELETE RESTRICT ON UPDATE RESTRICT;
на цьому все, таблиці пов'язані через foreign key.
Чому ж зв'язку зручно тримати в самій базі даних?Адже це завдання зазвичай вирішує так і сам додаток?