Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы и банки данных.doc
Скачиваний:
10
Добавлен:
12.11.2019
Размер:
745.98 Кб
Скачать

3. Создание и уничтожение индексов. Поддержка ссылочной целостности.

Индекс – это упорядоченный список содержимого столбцов или группы столбцов в таблице. Он служит для ускорения поиска данных в таблице. Т.к. записи в таблице в общем случае не упорядочены, то поиск записи по значению поля проводится последовательным просмотром. При длине таблицы в N записей это, в среднем, требует N/2 проверок. При наличии индекса, в среднем, требуется log 2N проверок.

Индекс также служит для быстрого нахождения записей, для которых значение поля находится в определённых пределах. Быстро отсортировать записи по совпадающему значению поля, извлечь записи из таблицы в отсортированных последовательностях и т.д. Будучи однажды созданным, индекс остаётся невидимым для пользователя. SQL сам решит, когда воспользоваться индексом и сделает это автоматически. Также автоматически выполнится обновление индекса при обновлении индексируемой таблицы.

Индекс может быть непосредственно создан командами CREATE TABLE и ENTER TABLE. Формат этой команды имеет следующий вид:

CREATE [UNIQUE] INDEX имя_таблицы ON имя_таблицы (имя_столбца, … , имя_столбца );

Где:

UNIQUE – значение индекса должно быть уникальным в таблице. SQL отслеживает уникальность индекса и не позволяет изменить БД так, чтобы уникальность нарушилась. Такой индекс нельзя создать, если таблица содержит записи с повторяющимися значениями поля. Уникальные индексы следует создавать одновременно с созданием таблиц.

имя_индекса уникально в базе данных.

имя_таблицы – имя индексируемой таблицы

имя_столбца – это имя столбца таблицы по значению которого строится индекс. Если указано несколько столбцов, индексы упорядочиваются по значению первого столбца, при совпадении значения – второго и т.д.

Пример:

CREATE INDEX Студфам ON Студент (sname);

Т.к. возможны полные однофамильцы, индекс строится не уникальным. Необходимость поименования индекса в основном связана с возможностью и необходимостью его уничтожения. Уничтожение индекса осуществляется по команде

DROP INDEX имя_индекса;

Две таблицы находятся, как правило, в отношении один ко многим через значения связующих полей. Для приведённого примера такая связь между таблицами Студент и Оценка по значениям полей snum и osnum. При этом, связующее поле со стороны отношения один называется родительским ключом, а со стороны многие – внешним ключом. SQL автоматически поддерживает отношения ссылочной целостности при внесении данных, если для таблицы определён внешний ключ. Это можно сделать в виде ограничения на столбец, являющийся внешним ключом в следующем формате:

REFERENCES родительская_таблица (столбец);

А можно сделать и в виде ограничения на таблицу:

FOREIGN KEY (список_стобцов_внеш_ключа) REFERENS родительская_таблица [(список_столбцов)];

В обоих случаях могут не указываться столбцы ключа родительской таблицы, если они определены параметром PRIMARY KEY. Типы столбцов в ключах обеих таблиц должны соответствовать друг другу.

Пример:

CREATE TABLE оценка (opnum char (3) NOT NULL REFERENS преподаватель (pnum), osnum char (3) NOT NULL REFERENS студент (snum), …

Пример (для таблицы Студент):

CREATE TABLE студент (snum char (3) PRIMARY KEY, sname char (30) NOT NULL, sgrp char (3), FOREIGN KEY (spdp) REFERENCE преподаватель (pnum));

Возможны также экзотические случаи, когда внешний ключ ссылается на таблицу, в которой он сам определён. Например, таблица Преподаватель может содержать столбец со ссылкой каждого преподавателя на заведующего кафедрой, в тоже время, заведующий сам является преподавателем, поэтому необходимо добавить ещё одно поле:

zavcaf char (3) FEFERENCES преподаватель (pnum);

При определении таблицы с внешним ключом можно определить или ограничить выполнение действий над таблицей с родительским ключом:

  1. Запретить удаление записи или обновление родительского ключа при наличии связанных записей в таблице с внешним ключом.

UPDATE/DELETE OF родительская_табл RESTRICTED;

  1. При удалении записи или обновлении родительского ключа автоматически удалять или обновлять записи с тем же внешним ключом.

UPDATE/DELETE OF родительская_табл CASCADES;

  1. При удалении записи или обновлении родительского ключа, значение внешнего ключа автоматически устанавливается в NULL.

UPDATE/DELETE OF родительская_табл NULLS;

Пример:

CREATE TABLE студент (… spdp char (3) REFERENS преподаватель (pnum), UPDATE OF преподаватель CASCADE, DELETE OF преподаватель NULLS);