Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по серверам.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
748.54 Кб
Скачать
    1. Задание ограничений ссылочной целостности

При описании таблиц задаются ограничения, обеспечивающие ссылочную целостность данных с помощью средств задания внешних ключей и NULL-ограничений. Например, таблица USP (см. Error: Reference source not found) подчинена двум другим таблицам: PREDM и STUDENTS. При этом таблица USP связана с таблицей STUDENTS обязательной связью, так как в ней должны быть отражены данные обо всех студентах. Каждому значению атрибута NOM_ZACH в таблице USP должно соответствовать ровно одно значение этого же атрибута в таблице STUDENTS. В таблице USP не может быть значений атрибута NOM_ZACH, которых нет в таблице STUDENTS. В то же время кто-либо из студентов мог не сдавать один или несколько экзаменов, поэтому связь с таблицей PREDM будет не обязательной. Для моделирования этих связей должны быть определены два внешних ключа (FOREIGN KEY) для полей NOM_ZACH и PKOD. Для поля NOM_ZACH должно быть задано значение NOT NULL.

Ключ FOREIGN KEY ограничивает значения, которые можно ввести в БД так, чтобы заставить внешний и родительский ключи соответствовать принципу ссылочной целостности. Одно из действий этого ограничения – отбрасывать такие значения для полей, ограниченных как внешний ключ, которые отсутствуют в родительском ключе. Синтаксис ограничения FORIGN KEY:

FOREIGN KEY <список полей> REFERENCES <имя таблицы, содержащей родительский ключ >[список полей родительского ключа].

Создадим таблицу USP с полем NOM_ZACH, определенном в качестве внешнего ключа, ссылающегося на таблицу STUDENTS.

CREATE TABLE USP

(NOM_ZACH INTEGER NOT NULL,

PKOD INTEGER,

TNUM INTEGER,

UDATE DATE ,

MARK INTEGER,

PRIMARY KEY(NOM_ZACH, PKODL)

FOREIGN KEY (NOM_ZACH) REFERENCES STUDENTS (NOM_ZACH),

FOREIGN KEY (PKOD) REFERENCES PREDM (PKOD));

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

CREATE TABLE USP

(NOM_ZACH INTEGER NOT NULL FOREIGN KEY REFERENCES STUDENTS,

PKOD INTEGER FOREIGN KEY REFERENCES PREDM,

TNUM INTEGER,

UDATE DATE ,

MARK INTEGER,

PRIMARY KEY (NOM_ZACH,PKOD));

В соответствии со стандартом, изменение или удаление значений родительского ключа не допускается. Это означает, что нельзя удалить данные о студенте из таблицы STUDENTS до тех пор, пока в таблице USP для него имеется какая-нибудь информация. Однако довольно часто возникают ситуации, когда необходимо удалить информацию о студенте, например, в случае его отчисления. В таких случаях рассматривается возможность каскадирования или ограничения действий.

При необходимости изменить или удалить текущее ссылочное значение родительского ключа существует три возможности:

  1. Запретить изменения.

  2. Сделав изменения в родительском ключе, произвести изменения во внешнем ключе автоматически (каскадное изменение).

  3. Сделать изменение в родительском ключе и установить внешний ключ в NULL значение автоматически.

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

Итак, изменения в родительском ключе можно разделить на ограниченные (RESTRICTED), каскадируемые (CASCADES) и пустые (NULL) изменения. Рассмотрим примеры: предположим, что есть необходимость в изменении номера зачетной книжки, причем оценки должны сохраниться у этого же студента c новым номером. В этом случае следует указать команду UPDATE c каскадируемыми изменениями. То есть:

CREATE TABLE USP

(NOM_ZACH INTEGER NOT NULL FOREIGN KEY REFERENCES STUDENTS,

PKOD INTEGER FOREIGN KEY REFERENCES PREDM,

TNUM INTEGER,

UDATE DATE ,

MARK INTEGER,

PRIMARY KEY(NOM_ZACH,PKOD),

UPDATE OF STUDENTS CASCADES);

Если данные о студенте удаляются, удаление их должно быть выполнено сначала в главной (STUDENTS), а затем в подчиненной таблице (USP). В этом случае используется ограничение

DELETED OF STUDENTS RESTRICTED

После этого при удалении данных о студенте из таблицы STUDENT команда не будет выполнена до тех пор, пока не будут удалены его данные из таблицы USP.

Для того чтобы при удалении номера зачетки из таблицы STUDENTS его оценки сохранились в таблице USP, а в поле NOM_ZACH таблицы USP, относящемся к данному студенту появились NULL значения, необходимо указать:

CREATE TABLE USP

(NOM_ZACH INTEGER FOREIGN KEY REFERENCES STUDENTS,

PKOD INTEGER FOREIGN KEY REFERENCES PREDM,

TNUM INTEGER,

UDATE DATE ,

MARK INTEGER,

PRIMARY KEY(NOM_ZACH,PKOD),

DELETED OF STUDENTS NULLS);

В этом случае ограничения NOT NULL для поля NOM_ZACH, быть не должно.