Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 1 - Проектирование БД.doc
Скачиваний:
49
Добавлен:
12.04.2015
Размер:
448.51 Кб
Скачать

6. Ссылочная целостность

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

Простой внешний ключ объявляется конструкцией FOREIGNKEYREFERENCES…

CREATE TABLE Leave( -- таблица "Отпуск"

-- табельный номер работника – внешний ключ на таблицу Staff

TabNum INT FOREIGN KEY REFERENCES Staff(TabNum),

StartDate DATE NOT NULL, -- начало отпуска

FinDate DATE); -- окончание отпуска

Составной внешний ключ объявляется через ограничение целостности при создании таблицы CREATETABLEили модификации структуры таблицы командойALTERTABLE.

CREATE TABLE Order( -- таблица "Заказы"

OrderNum INT PRIMARY KEY -- номер заказа

ODate DATE NOT NULL, -- дата заказа

-- столбцы внешнего ключа

ClPastSeria NUMERIC(4,0) NOT NULL, -- серия паспорта клиента

ClPasNumber NUMERIC(6,0) NOT NULL, -- номер паспорта клиента

-- объявление внешнего ключа, ссылающегося на таблицу Clients

CONSTRAINT Order_FK FOREIGN KEY (ClPastSeria,ClPasNumber)

REFERENCES Clients(PastSeria,PasNumber));

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

На этот случай в СУБД предусматривается несколько типов реакций:

1) каскадное удаление(DELETECASCADE) – при удалении целевой строки СУБД автоматически удаляет все ссылающиеся на нее строки подчиненных таблиц6.

2) запрещение удаления(DELETENOACTION) – СУБД запрещает удаление строки, пока на нее есть ссылки. В этом случае нужно сначала удалить все ссылающиеся строки, а затем – целевую строку.

3) установка внешнего ключа в NULL или в значение по умолчанию(DELETESETNULL / DEFAULT) – при удалении целевой строки поле внешнего ключа устанавливается вNULLили значение по умолчанию.

Аналогичные типы реакции предусматриваются при изменении значения первичного ключа целевой таблицы: UPDATECASCADE,UPDATENOACTION,UPDATESETNULL,UPDATESETDEFAULT.

CREATE TABLE Leave( -- таблица "Отпуск"

TabNum INT FOREIGN KEY REFERENCES Staff(TabNum)

ON DELETE CASCADE

ON UPDATE CASCADE,

StartDate DATE NOT NULL,

FinDate DATE);

Внешние ключи могут ссылаться на столбцы UNIQUE.

СУБД MySQL 3.23 внешние ключи позволяет объявлять (в целях совместимости с будущими версиями), но целостность по внешним ключам не поддерживает.

Описанные в п.1–6 ограничения целостности называются декларативными, потому что они объявляются при определении структуры таблиц. Перед каждой операцией вставки, модификации или удаления строк СУБД автоматически проверяет эти ограничения. Если ограничений целостности нарушаются, сервер отменяет операцию и выдает сообщение об ошибке.

Стандартные типы данных

Тип данных определяет формат, в котором хранится значение столбца. Стандарт SQL92 предусматривает набор базовых типов данных. Реальные СУБД, как правило, дополняют этот набор своими, специфическими типами данных с целью повышения функциональности системы. В таблице 1 приведены типы данных, поддерживаемые СУБДMicrosoftSQLServer2000,MySQL 3.23,InterBase6.0.

Таблица 1

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.