Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

db / Лекции / 6 семестр / Языки запросов

.pdf
Скачиваний:
66
Добавлен:
23.03.2015
Размер:
1.14 Mб
Скачать

вается, какому именно факультету принадлежит кафедра. Столбец (группа столбцов), на который ссылается внешний ключ, обычно называется ссылоч-

ным ключом. Таблица, из которой делается ссылка, называется дочерней, а та,

на которую делается ссылка, – родительской (это может быть и одна таблица).

Одна и та же таблица может иметь множество внешних ключей для установле-

ния связей с несколькими таблицами. Так, таблица LECTURE учебной базы данных имеет внешние ключи для связи с таблицами ROOM (столбец RomFK), SUBJECT (столбец SbjFK), TEACHER (столбец TchFK) и SGR0UP (столбец

GrpFK).

Внешний ключ допускает значения NULL, но их можно запретить уста-

новлением ограничения NOT NULL. Это полезно, когда существует так назы-

ваемая зависимость по существованию, когда объекты одного класса не могут существовать без объектов другого класса. Например, нет смысла говорить о занятии в расписании, если не определены ведущий его преподаватель, дисци-

плина, аудитория и группа.

Внешний ключ и его ссылочный ключ должны иметь одинаковое количе-

ство столбцов и одинаковые или совместимые типы данных для соответствую-

щих столбцов. Внешний ключ, состоящий из одного столбца, называется про-

стым, а из нескольких – составным. Чаще всего используются простые внеш-

ние и соответствующие им ссылочные ключи.

Связывание внешнего ключа со ссылочным позволяет устанавливать меж-

ду таблицами отношения один-к-одному и один-ко-многим. В нашем случае имеет место отношение один-ко-многим – на одном факультете может быть не-

сколько кафедр, но каждая кафедра принадлежит только одному факультету.

Связь многие-ко-многим (как если бы кафедра подчинялась нескольким фа-

культетам) не может быть непосредственно представлена с помощью кон-

струкции ссылочный/внешний ключ.

Ссылочная целостность задается фразой FOREIGN KEY, в которой нужно указывать внешний и соответствующий ему ссылочный ключи. В этой фразе можно также указать, каким образом следует поддерживать ссылочную целост-

81

ность в случае изменения или удаления одного из значений ссылочного ключа.

Ссылочное ограничение, как и любое другое, задается в предложении CREATE TABLE и может быть определено как ограничение столбца или как ограниче-

ние таблицы.

Простой внешний ключ

Определение столбца как внешнего ключа имеет следующий синтаксис:

имя_столбца тип_данных [CONSTRAINT имя_ограничения] REFERENCES

имя_родительской_таблицы [столбец_родительской_таблицы]

Вэтом случае роль ссылочного ограничения исполняет фраза

REFERENCES. Например, связь между таблицами FACULTY и DEPARTMENT

указывается в таблице DEPARTMENT следующим внешним ключом:

FacFK INTEGER CONSTRAINT dep_fak_fac REFERENCES FACULTY(FacPK)

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

FACULTY, предыдущий пример может быть записан следующим образом:

FacFK INTEGER REFERENCES FACULTY

Составной внешний ключ

Составной внешний ключ указывается после определения столбцов табли-

цы и имеет следующий синтаксис:

[CONSTRAINT имя_ограничения] FOREIGN KEY

(список_столбцов_дочерней_таблицы) REFERENCES

имя_родительской_таблицы [(список_столбцов_родительской_таблицы)]

Учитывая, что в учебной базе данных таблица ROOM содержит простой первичный ключ RomPK и составной уникальный ключ (Num, Building), из таблицы LECTURE можно сослаться на таблицу ROOM следующими двумя способами:

CREATE TABLE LECTURE

RomFK INTEGERб

CONSTRAINT leс fkey rom FOREIGN KEY (RomFK) REFERENCES

ROOM(RomPK);

82

и

CREATE TABLE LECTURE

RomNumFK NUMBER(3).

RomBldFK CHAR(5),

CONSTRAINT lec_fkey_rom FOREIGN KEY (RomNumFK, RomBldFK) REFERENCES ROOM (Num. Building);

Поддержка ссылочной целостности

Рассмотрим, какие имеются возможности по поддержке ссылочной це-

лостности при манипулировании строками родительской и дочерней таблиц.

При вставке или обновлении строк дочерней таблицы СУБД проверяет, нару-

шают ли эти действия ссылочную целостность. Если это так, встав-

ка/обновление строки запрещается. Удаление строки дочерней таблицы вообще не может привести к нарушению ссылочной целостности (если, конечно, она одновременно не является родительской для другой ссылки).

Вставка строки родительской таблицы не вызывает проблем с поддержкой ссылочной целостности (если, конечно, она одновременно не является дочерней для другой ссылки). А удаление или обновление ее строк может нарушить ссы-

лочную целостность. Например, если удаляемый факультет имеет в своем со-

ставе кафедры, они останутся без факультета – их внешние ключи будут ссы-

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

ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT} ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}

Смысл этих вариантов следующий.

RESTRICT – запрещается удалять строку (или изменять значение ссылоч-

ного ключа строки) родительской таблицы, если на эту строку имеются ссылки из дочерней таблицы.

CASCADE – удаление строки в родительской таблице приводит к удале-

нию всех связанных с ними строк дочерней таблицы. Изменение значения ссы-

лочного ключа родительской таблицы приводит к соответствующему измене-

нию значений внешних ключей дочерней таблицы.

83

SET NULL – удаление строки (или изменение значения ссылочного ключа)

родительской таблицы приводит к установке в значение NULL всех внеш-

них ключей дочерней таблицы, которые ссылаются на удаленные (или изме-

ненные) значения ссылочного ключа родительской таблицы.

SET DEFAULT – удаление строки (или изменение значения ссылочного ключа) родительской таблицы приводит к установке в значение по умолчанию всех внешних ключей дочерней таблицы, которые ссылаются на удаленные

(или измененные) значения ссылочного ключа родительской таблицы.

1.10.7 Изменение ограничений целостности

С помощью предложения ALTER TABLE можно осуществлять следующие переопределения таблиц, которые затрагивают ограничения целостности:

добавлять новые ограничения (столбца и таблицы);

удалять существующие ограничения (столбца и таблицы).

Изменять существующие ограничения целостности нельзя. Их нужно уда-

лить и затем определить новые.

К существующему столбцу можно добавлять только значение по умолча-

нию и ограничение NOT NULL. Все другие ограничения добавляются к столб-

цу в синтаксисе ограничений таблицы. Используйте следующий формат этой команды для добавления ограничения:

ALTER TABLE имя_таолицы MODIFY

имя_столбца (ограниченнее, ограничение]...);

Например, предложение:

ALTER TABLE TEACHER MODIFY

(IDCode CONSTRAINT tch_idc NOT NULL DEFAULT '1111111111');

приводит к добавлению ограничения целостности ограничения NOT NULL

и значения по умолчанию. Добавление ограничений таблицы описывается точ-

но так же, как и добавление столбца:

ALTER TABLE ADD ограничение_целостности;

Например, предложение:

ALTER TABLE TEACHER ADD UNIQUE (IDCode);

84

приводит к добавлению нового ограничения целостности к таблице

TEACHER.

Удаление ограничений производится командой ALTER TABLE DROP, ко-

торая имеет три варианта:

ALTER TABLE имя_таблицы DROP PRIMARY KEY [CASCADE];

ALTER TABLE имя_таблицы DROP UNIQUE (столбец[, столбец]...)

[CASCADE];

ALTER TABLE имя_таблицы DROP CONSTRAINT имя_ограничения;

Фраза CASCADE указывает, что необходимо автоматически удалять ссы-

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

ем при определении ограничений целостности всегда задавать имена. Приведем примеры удаления ограничений.

ALTER TABLE TEACHER DROP CONSTRAINT tch_chk_sal_ris2;

ALTER TABLE TEACHER DROP UNIQUE (IDCode);

1.10.8 Итоги лекции

Усвоив материал этой лекции, студенты научились:

определять ограничения целостности в синтаксисе ограничения столбца

исинтаксисе ограничения таблицы;

изменять ограничения целостности;

удалять ограничения целостности.

2 Программирование БД (19)

85