Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
db / Лекции / 6 семестр / Языки запросов.docx
Скачиваний:
123
Добавлен:
23.03.2015
Размер:
280.32 Кб
Скачать
      1. Ограничение первичного ключа

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

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

Синтаксис ограничения первичного ключа имеет следующий вид:

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

Вот как, например, выглядит определение первичного ключа в таблице ROOM:

CREATE TABLE ROOM

(RomPK INTEGER CONSTRAINT rom_prk PRIMARY KEY,

Num NUMBER(3) NOT NULL,

Building CHAR(5) NOT NULL,

Seats NUMBERO),

CONSTRAINT rom_unq_num_bld UNIQUE (Num, Building));

Составной первичный ключ

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

[CONSTRAINT имя_ограничения] PRIMARY KEY (список_столбцов)

Если бы в таблице ROOM первичным ключом являлась пара столбцов Num и Building, это нужно было бы записать следующим образом:

CREATE TABLE ROOM

(Num NUMBER(3),

Building CHAR(5),

Seats NUMBERO),

CONSTRAINT rom_unq_num_bld PRIMARY KEY (Num, Building));

      1. Ограничение ссылочной целостности

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

Внешний ключ и ссылочная целостность

Внешний ключ– это столбец (или совокупность столбцов), с помощью которого между строками двух таблиц устанавливается связь. Например, для связи между кафедрами (таблица DEPARTMENT) и факультетами (таблицы FACULTY) в таблице DEPARTMENT помимо столбцов данных кафедры существует дополнительный столбец FacFK, с помощью значений которого указывается, какому именно факультету принадлежит кафедра. Столбец (группа столбцов), на который ссылается внешний ключ, обычно называетсяссылочным ключом. Таблица, из которой делается ссылка, называетсядочерней, а та, на которую делается ссылка, –родительской(это может быть и одна таблица). Одна и та же таблица может иметь множество внешних ключей для установления связей с несколькими таблицами. Так, таблица LECTURE учебной базы данных имеет внешние ключи для связи с таблицами ROOM (столбец RomFK), SUBJECT (столбец SbjFK), TEACHER (столбец TchFK) и SGR0UP (столбец GrpFK).

Внешний ключ допускает значения NULL, но их можно запретить установлением ограничения NOT NULL. Это полезно, когда существует так называемая зависимость по существованию, когда объекты одного класса не могут существовать без объектов другого класса. Например, нет смысла говорить о занятии в расписании, если не определены ведущий его преподаватель, дисциплина, аудитория и группа.

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

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

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

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

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

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

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

FacFK INTEGER CONSTRAINT dep_fak_fac REFERENCES FACULTY(FacPK)

Столбец родительской таблицы можно не указывать, если ссылочный ключ является в ней первичным, то есть имеющим ограничение PRIMARYKEY. Например, так как столбец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);

и

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 – удаление строки в родительской таблице приводит к удалению всех связанных с ними строк дочерней таблицы. Изменение значения ссылочного ключа родительской таблицы приводит к соответствующему изменению значений внешних ключей дочерней таблицы.

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

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

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