вается, какому именно факультету принадлежит кафедра. Столбец (группа столбцов), на который ссылается внешний ключ, обычно называется ссылоч-
ным ключом. Таблица, из которой делается ссылка, называется дочерней, а та,
на которую делается ссылка, – родительской (это может быть и одна таблица).
Одна и та же таблица может иметь множество внешних ключей для установле-
ния связей с несколькими таблицами. Так, таблица 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