Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_KL_2010_14.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
28.97 Mб
Скачать

Предложения primary key и foreign key

Кроме определений столбцов таблицы, в инструкции CREATE TABLE указывается информация о первичном ключе таблицы и ее связях с другими таблицами базы данных. Эта информация содержится в предложениях PRIMARY KEY и FOREIGN KEY.

Предложением PRIMARY KEY задается столбец или столбцы, которые образуют первичный ключ и служат в качестве уникального идентификатора строк таблицы. СУБД автоматически следит за тем, чтобы первичный ключ был уникален. Кроме того в определениях столбцов первичного ключа должно быть указано, что они не могут содержать значения NULL (имеют ограничения NOT NULL).

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

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

  • список столбцов внешнего ключа − определяет столбцы дочерней таблицы, по которым строится внешний ключ; столбец или столбцы создаваемой таблицы, которые образуют внешний ключ;

  • имя таблицы-предка − определяет таблицу, в которой описан первичный ключ. На этот ключ должен ссылаться внешний ключ дочерней таблицы для обеспечения ссылочной целостности; таблица, связь с которой создает внешний ключ; это таблица-предок, а определяемая таблица в данном отношении является потомком;

  • список столбцов таблицы-предка − необязателен при ссылке на первичный ключ родительской таблицы;

  • ON DELETE или ON UPDATE − определяют способы изменения подчиненных записей дочерней таблицы при удалении или изменении поля связи в записи родительской таблицы. Перечислим эти способы:

  • NO ACTION − запрет удаления/изменения родительской записи при наличии подчиненных записей в дочерней таблице;

  • CASCADE − для оператора ON DELETE: при удалении записи родительской таблицы происходит удаление подчиненных записей в дочерней таблице; для оператора ON UPDATE: при изменении поля связи в записи родительской таблицы происходит изменение на то же значение поля внешнего ключа у всех подчиненных записей в дочерней таблице;

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

  • SET NULL − в поле внешнего ключа заносится значение NULL.

Ниже приводится расширенная инструкция CREATE TABLE для таблицы ZAKAZY, в которую входит определение первичного ключа и трех внешних ключей, имеющихся в таблице:

CREATE TABLE ZAKAZY

(ID_ORDER INTEGER NOT NULL,

Рис. 1.1.  Имена связей в инструкции CREATE TABLE

DATE_ORDER DATE NOT NULL,

ID_CLN INTEGER NOT NULL,

ID_SLZH INTEGER,

ID_MFR CHAR(3) NOT NULL,

ID_PRD CHAR(5) NOT NULL,

COUNT INTEGER NOT NULL,

PRICE_ALL MONEY NOT NULL,

PRIMARY KEY (ID_ORDER),

CONSTRAINT PLACEDBY

FOREIGN KEY (ID_CLN) REFERENCES CLIENTY ON DELETE CASCADE,

CONSTRAINT TAKENBY

FOREIGN KEY (ID_SLZH) REFERENCES SLUZHASCHIE ON DELETE CASCADE,

CONSTRAINT PLACEDBY

FOREIGN KEY (ID_MFR, ID_PRD) REFERENCES TOVARY ON DELETE CASCADE

)

На Рис. 1.1. изображены три созданные этой инструкцией связи с присвоенными им именами. В общем случае связи следует давать имя, поскольку оно помогает лучше понять, какая именно связь создана внешним ключом. Например, каждый заказ делается клиентом, идентификатор которого находится в столбце CUST таблицы ZAKAZY. Связь с этим столбцом получила имя PLACEDBY.

Когда СУБД выполняет инструкцию CREATE TABLE, она сравнивает определение каждого внешнего ключа с определениями связанных таблиц. СУБД проверяет, соответствуют ли друг другу внешний и первичный ключи в связанных таблицах как по числу столбцов, так и по типу данных. Для того чтобы такая проверка была возможна, связанная таблица уже должна быть определена.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]