Кроме определений столбцов таблицы, в инструкции CREATE TABLE указывается информация о первичном ключе таблицы и ее связях с другими таблицами базы данных. Эта информация содержится в предложениях PRIMARY KEY и FOREIGN KEY. Большинство основных реляционных СУБД поддерживает эти предложения.
В предложении PRIMARY KEY задается столбец, или столбцы, которые образуют первичный ключ таблицы. Как уже говорилось, этот столбец (или комбинация столбцов) служит в качестве уникального идентификатора строк таблицы. СУБД автоматически следит за тем, чтобы первичный ключ каждой строки таблицы имел уникальное значение. Кроме того, в определениях столбцов первичного ключа должно быть указано, что они не могут содержать значения NULL (имеют ограничение NOT NULL).
В предложении FOREIGN KEY задается внешний ключ таблицы и определяется связь, которую он создает для нее с другой таблицей (таблицей-предком). В нем указываются:
• столбец или столбцы создаваемой таблицы, которые образуют внешний ключ; таблица, связь с которой создает внешний ключ – это таблица – предок, а определяемая таблица в данном отношении является потомком;
• необязательное имя для этого отношения; оно не используется в инструкциях SQL, но может появляться в сообщениях об ошибках и потребуется в дальнейшем, если будет необходимо удалить внешний ключ;
• необязательное правило удаления для данного отношения (CASCADE, как описывалось в предыдущем разделе), которое определяет действие, предпринимаемое при удалении строки-предка;
• необязательное правило обновления для данного отношения (эти правила описаны в предыдущем разделе), которое определяет действие, предпринимаемое при обновлении первичного ключа в строке-предке;
Вообще правил удаления всего четыре, однако правила SET NULL и SET DEFAULT некоторыми основными СУБД не поддерживаются, поэтому они и не указаны в синтаксической диаграмме, а правило RESTRICT не нуждается в явном указании, так как в большинстве СУБД воспринимается по умолчанию. Правил обновления также четыре, однако например даже в такой мощной среде как ORACLE ни одно из них, за исключением запрещающего, не работает. На синтаксической диаграмме для наглядности задания директивы CREATE TABLE, правило каскадного обновления (ON UPDATE CASCADE) всё же включено, что, однако не делает его “рабочим” в некоторых системах.
В качестве примера рассмотрим инструкцию CREATE TABLE для создания таблицы сделанных заказов (ORDERS) базы данных, структура которой изображена на рисунке 14 со всеми внешними ключами и именованными связями посредством них созданными.
Создать таблицу ORDERS с первичными и внешними ключами
create table orders (order_n integer not null,
ord_date date not null,
cust_n integer,
sale_n integer,
prod_n varchar2(10),
qty intrger,
amount integer,
primary key (order_n),
constraint placed_by foreign key (cust_n) references customers on delete cascade,
Когда СУБД выполняет инструкцию CREATE TABLE, она сравнивает определение каждого внешнего ключа с определениями связанных таблиц. СУБД проверяет, соответствуют ли друг другу внешний ключ и первичный ключ в связанных таблицах, как по числу столбцов, так и по типу данных. Для того чтобы такая проверка была возможна, связанная таблица уже должна быть определена.
Если две или более таблиц образуют ссылочный цикл, то для первой создаваемой таблицы невозможно определить внешний ключ, так как связанная с нею таблица еще не существует. СУБД откажется выполнять инструкцию CREATE TABLE, выдав сообщение о том, что в определении таблицы присутствует ссылка на несуществующую таблицу. В этом случае необходимо создать таблицу без определения внешнего, ключа и добавить данное определение с помощью инструкции ALTER TABLE, которая рассматривается ниже в настоящем разделе.