
- •Практичні завдання
- •2.Робота із запитами Теоретичні відомості
- •Практичні завдання
- •3. Функції маніпулювання даними Теоретичні відомості
- •Практичні завдання
- •Теоретичні відомості
- •Практичні завдання
- •5. Об’єднання таблиць Теоретичні відомості
- •Практичні завдання
- •7. Представлення Теоретичні відомості
- •Практичні завдання
- •8. Індекси. Зовнішній ключ Теоретичні відомості
- •Практичні завдання
- •9. Транзакції Теоретичні відомості
- •Практичні завдання
- •10. Проектування власної бази даних MySql
8. Індекси. Зовнішній ключ Теоретичні відомості
Будь-які стовпці в таблицях можуть бути індексовані, створення індексів є одним із способів пришвидшити виконання SQL-запитів. Індекси використовують для того, щоб:
Швидко знайти рядки, що відповідають виразу WHERE.
Витягнути рядки з інших таблиць при виконанні об’єднань ( оператор JOIN).
Знайти величини МАХ() або MIN() Для заданого індексованого стовпця.
Виконувати сортування або групування в таблиці, якщо ці операції робляться на крайньому ліворуч префіксі ключа, що використовується.
Коли всі значення одного поля таблиці представлені в полі іншої таблиці, кажуть, що перше поле посилається на друге. Це вказує на прямий зв’язок між значеннями двох полів. Наприклад, кожен із студентів в таблиці Studentsмає поле faculty_ID,яке вказує на факультет, описаний в таблиці Faculty.
Коли одне поле в таблиці посилається на інше, воно називається зовнішнім ключем; а поле, на яке воно посилається, називається батьківським ключем. Таким чином поле faculty_idз таблиці students— це зовнішній ключ, а поле id на яке воно посилається в таблиці Faculty— це батьківський ключ.
Імена зовнішнього ключа і батьківського ключа часто бувають однаковими (у нашому прикладі це не так), так роблять, щоб підкреслити зв’язок між таблицями і зробити його більш наглядним.
Обмеження (зовнішні ключі, “foreign key”) підтримують таблиці InnoDB. Синтаксис визначення зовнішнього ключа такий:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name,
...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
Для визначення зовнішніх ключів повинні виконуватися такі
умови:
Обидві таблиці повинні мати тип InnoDB, жодна з таблиць не повинна бути тимчасовою.
У батьківській таблиці повинен бути індекс по батьківському ключу. Індекс по відповідному полю в дочірній таблиці створюється автоматично при визначенні обмеження.
Зовнішні ключі по полях BLOB і TEXT не підтримуються.
Якщо вказано [CONSTRAINT symbol] (ім’я обмеження) то воно повинне бути унікальним в даній БД, якщо ні, то ім’я буде згенероване автоматично.
Практичні завдання
Віднести останню додану спеціальність до останнього доданого факультету.
Так як ми вказуємо точний шлях до таблиць, то SQL-запит можна виконувати будь-звідки. Використовуємо UPDATE.
UPDATE `univer`.`speciality` SET `faculty_id` = '6' WHERE `speciality`.`id` =8 AND `speciality`.`name` = 'Конструкція літаків' LIMIT 1;
Додати індекс до поля faculty_id.
Щоб додати індекс до поля faculty_id, використовуємо ALTER TABLE
ALTER TABLE `speciality` ADD INDEX (`faculty_id`);
Створити зовнішній ключ по полю faculty_id таблиці speciality.
Заходимо в БД univer, далі переходимо до пункту меню SQL та вписуємо:
ALTER TABLE `speciality` ADD FOREIGN KEY ( `faculty_id` ) REFERENCES `univer`.`students` (`faculty_id`
) ON DELETE RESTRICT ON UPDATE RESTRICT ;
Знищити щойно створений зовнішній ключ.
В тому ж самому полі, одразу знищуємо ключ
ALTER TABLE `speciality` DROP FOREIGN KEY `speciality_ibfk_1`;
Знову створити зовнішній ключ з використанням інструментів phpmyadmin. Для цього потрібно виконати наступні дії:
1) Вибрати перегляд залежностей.
2)Вибрати налаштування, як показано на зразку нижче, натиснути зберегти.
Виконати наступні дії вручну
Додати в таблицю speciality нову спеціальність з faculty_id відмінним від id факультетів із таблиці faculty. Зробити висновок про отриману помилку.
Так як вказуємо точний шлях до таблиць, SQL записуємо будь звідки:
insert into `univer`.`speciality` (`name`,`faculty_id`) values ('Конструкція літаків', '6');