Опубликован: 02.08.2007 | Уровень: специалист | Доступ: платный
Лекция 9:

Создание объектов для хранения данных. Работа с ограничениями

Назначение первичных ключей таблицам

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

Задание колонки как первичного ключа в контексте многих СУБД, в том числе и Oracle, считается ограничением на значение колонки (см. следующий подраздел).

Стандартом SQL-92 предусмотрено специальное предложение PRIMARY KEY команды CREATE TABLE для спецификации первичного ключа таблицы. Атрибуты первичного ключа перечисляются через запятую и заключаются в круглые скобки. Если спецификация PRIMARY KEY не определяется, то считается, что таблица не имеет первичного ключа. При этом допускается дублирование строк в таблице.

Пример. Для нашего примера колонками первичного ключа могут быть назначены: колонка DEPNO в отношении DEPARTAMENT, колонка EMPNO в отношении EMPLOYEE, колонка PROJNO в отношении PROJECT.

CREATE TABLE DEPARTAMENT 
( 
	DEPNO 	integer, 
	DNAME 	char(20),
	LOC   	char(20),
	MANAGER 	char(20),
	PHONE  	char(15),
	PRIMARY KEY (DEPNO)  определение первичного ключа
);

CREATE  TABLE EMPLOYEE
(
	EMPNO  	integer,
	ENAME  	char(25),
	LNAME  	char(10),
	DEPNO  	int,
	SSECNO  	char(10),
	PROJNO  	char(8),
J	OB  		char(25),
	AGE  		date,
	HIREDATE 	date,
	SAL  		dec(9,2),
	COMM  	dec(9,2),
	FINE 		dec(9,2),
	PRIMARY KEY (EMPNO)
);

CREATE TABLE PROJECT 
(
	PROJNO  	char(8),
	PNAME  	char(25),
	BUDGET  	dec(9,2),
	PRIMARY KEY (PROJNO)
);

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

CREATE TABLE DEPARTAMENT 
( 
	DEPNO 	integer primary key,  определение первичного ключа
	DNAME 	char(20),
	LOC  		char(20),
	MANAGER 	char(20),
	PHONE  	char(15),
);

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

CREATE UNIQUE INDEX NDXDEPT ON DEPARTAMENT (DEPNO);

Предложение CREATE INDEX определяет имя индекса, предложение ON определяет имя таблицы и колонок, для которой и по которым строится индекс, ключевое слово UNIQUE указывает, что индексируемые значения колонок должны быть уникальными для таблицы, т.е. исключается дублирование значений в индексируемой колонке. Таблица должна быть уже создана, и должна содержать определения индексируемых столбцов. Спецификация UNIQUE опциональна, и вы можете также создавать и неуникальные индексы.

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

Поэтому для завершения процедуры определения первичных ключей базовых таблиц проектировщик базы данных должен будет добавить в скрипт три команды CREATE UNIQUE INDEX, как показано ниже:

CREATE UNIQUE INDEX NDXDEPT ON DEPARTAMENT (DEPNO);
CREATE UNIQUE INDEX NDXEMPLOYEE ON EMPLOYEE(EMPNO);
CREATE UNIQUE INDEX NDXPROJECT ON PROJECT(PROJNO);

Для диалекта SQL СУБД Oracle этого делать не нужно, т.к. она автоматически поддерживает целостность первичного ключа.

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

Александра Каева
Александра Каева
Михаил Забелкин
Михаил Забелкин
Евгений Вершинин
Евгений Вершинин
Россия, Нижний Новгород, Нижегородский государственный технический университет, 2008
Aleksandr Arshinskyi
Aleksandr Arshinskyi
Россия