Чтение онлайн

ЖАНРЫ

Информационные системы

Петров Владимир Николаевич

Шрифт:

Ограничение UNIQUE задается при создании таблицы с помощью ключевого слова UNIQUE, указываемого при описании поля:

CREATE TABLE имя_таблицы (

имя_поля_1 тип_данных NOT NULL PRIMARY KEY,

имя_поля_2 тип_данных UNIQUE,

имя_поля_3 тип_данных NOT NULL,

...

имя_поля_N тип_данных NOT NULL UNIQUE)

Можно также задать ограничение UNIQUE не для одного поля, а для группы полей. Объявление группы полей уникальной – не то же самое, что объявление уникальными нескольких отдельных полей, так как уникальной обязана быть именно комбинация значений, а не просто индивидуальные значения. То есть значение каждого поля, входящего в группу, не обязательно должно быть уникальным, а комбинация значений полей всегда должна быть уникальной.

Ограничение UNIQUE для группы полей, так же как и составной первичных ключ, задается после описания всех полей таблицы:

 

CREATE TABLE имя_таблицы (

имя_поля_1 тип_данных NOT NULL PRIMARY KEY,

имя_поля_2 тип_данных,

имя_поля_3 тип_данных NOT NULL,

...

имя_поля_N тип_данных NOT NULL UNIQUE,

UNIQUE (имя_поля_2, имя_поля_3))

Ограничение внешнего ключа

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

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

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

Когда поле таблицы является внешним ключом, оно определенным образом связано с таблицей, на которую этот ключ ссылается. Это фактически означает, что каждое значение во внешнем ключе непосредственно привязано к значению в родительском ключе.

В качестве иллюстрации использования ограничения внешнего ключа возьмем пример из предыдущей главы – базу данных по учету сотрудников некоторой организации (рис. 5.1). Эта база данных состоит из трех таблиц:

• СОТРУДНИКИ – содержит информацию о профессиональных данных сотрудников;

• ФИЗИЧЕСКИЕ ЛИЦА – содержит информацию о личных данных сотрудников;

• ДОЛЖНОСТИ – содержит информацию о должностях организации.

Основной таблицей в этой базе данных является таблица СОТРУДНИКИ, которая ссылается на две другие таблицы и, соответственно, должна иметь два внешних ключа. В качестве родительских ключей в таблицах ФИЗИЧЕСКИЕ ЛИЦА и ДОЛЖНОСТИ используются первичные ключи.

Ограничение внешнего ключа (FOREIGN KEY) может быть задано либо в операторе CREATE TABLE, либо в операторе ALTER TABLE. Синтаксис ограничения FOREIGN KEY имеет следующий вид:

FOREIGN KEY имя_внешнего_ключа (список полей внешнего ключа)

REFERENCES имя_родительской_таблицы (список полей родительского ключа)

Рис. 5.1. База данных сотрудников организации.


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

• число полей должно быть одинаковым;

• порядок следования полей в списках должен совпадать, причем совпадение определяется не именами полей, которые могут быть разными, а типами данных и размером полей.

Рассмотрим пример создания базы данных со связанными таблицами:

CREATE TABLE Физические_лица (

Код_физического_лица INTEGER NOT NULL PRIMARY KEY,

Имя VARCHAR(25) NOT NULL,

Фамилия VARCHAR(25) NOT NULL,

Отчество VARCHAR(25),

Дата_рождения DATE,

Адрес VARCHAR(50),

Телефон VARCHAR(25))


CREATE TABLE Должности (

Код_должности INTEGER NOT NULL PRIMARY KEY,

Должность VARCHAR(50) NOT NULL UNIQUE,

Разряд INTEGER NOT NULL,

Зарплата DECIMAL(7,2) NOT NULL)


CREATE TABLE Сотрудники (

Код_сотрудника INTEGER NOT NULL PRIMARY KEY,

Код_должности INTEGER,

Код_физического_лица INTEGER NOT NULL,

Рейтинг DECIMAL(4,2),

Дата_приема DATE NOT NULL,

Дата_увольнения DATE,

FOREIGN KEY Физ_ВК (Код_физического_лица)

REFERENCES Физические_лица (Код_физического_лица),

FOREIGN KEY Должн_ВК (Код_должности)

REFERENCES Должности (Код_должности))

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

ALTER TABLE имя_таблицы

ADD CONSTRAINT имя_внешнего_ключа FOREIGN KEY (список полей внешнего ключа)

REFERENCE имя_родительской_таблицы (список полей родительского ключа)

Примечание.

Следует иметь в виду, что при использовании оператора ALTER TABLE для создания связи между таблицами необходимо, чтобы связываемые таблицы находились в состоянии ссылочной целостности. Иначе при попытке выполнения оператора будет выдано сообщение об ошибке.

Внешний ключ ограничивает значения, которые можно ввести в таблицу. Чтобы в поля, составляющие внешний ключ, можно было ввести некоторое значение, необходимо, чтобы это значение уже было введено в родительской таблице. Например, чтобы занести в таблицу СОТРУДНИКИ данные о новом сотруднике, необходимо, чтобы в таблице ФИЗИЧЕСКИЕ ЛИЦА уже существовала запись о его личных данных – иначе невозможно будет заполнить обязательное поле Код_физического_лица.

Для внешнего ключа может быть задано ограничение NOT NULL, но это необязательно, а в некоторых случаях даже нежелательно. Например, предположим, что в организацию принимается на работу новый сотрудник, но еще не определена однозначно должность, которую он займет. В этом случае можно занести все необходимые данные о нем в таблицы ФИЗИЧЕСКИЕ ЛИЦА и СОТРУДНИКИ, ничего не указывая в поле Код_должности, которое будет заполнено позже.

Поделиться с друзьями: