2.1.1.2. Ключи в таблицах


В таблицах могут присутствовать следующие виды ключей — первичный ключ (primary key), уникальный ключ (unique key), внешний ключ (foreign key).

Первичный ключ

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

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

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

Стандарты SQL по какой-то причине не требуют обязательного присутствия первичного ключа в каждой таблице базы данных. Однако наличие такого ключа весьма и весьма желательно для каждой таблицы. Это показала практика использования реляционных баз данных. Забегая немного вперед, должен сказать, что в трактовке корпорации Microsoft первая нормальная форма таблиц требует обязательного наличия первичного ключа в каждой таблице. Это не соответствует общепринятой практике, но лично мне нравится.

Уникальный ключ

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

Система управления базами данных автоматически создает индекс для каждого уникального ключа таблицы. Индекс, создаваемый для уникального ключа, может быть кластерным, если для таблицы не существует другого кластерного индекса.
Уникальный ключ может присутствовать в связке таблиц вида "внешний ключ/уникальный ключ". Такая связка сейчас будет рассмотрена.

Внешний ключ

Внешний ключ (foreign key) — это столбец или группа столбцов таблицы, которые ссылаются на первичный или уникальный ключ другой или этой же самой таблицы.

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

ПРИМЕЧАНИЕ
Здесь требуется маленькое уточнение. Если внешний ключ ссылается на уникальный ключ родительской таблицы, то отдельные столбцы (не обязательно все) во внешнем ключе могут иметь значение NULL. В родительской таблице в этом случае также должна присутствовать строка, имеющая такую же комбинацию значений в столбцах, входящих в состав уникального ключа.

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

Отношения между таблицами в базе данных 

Важнейшими отношениями (связями) в реляционных базах данных являются отношение "внешний ключ/первичный ключ" и отношение "внешний ключ/уникальный ключ". Эти связи (отношения, relationship) между таблицами называются декларативной целостностью данных (declarative data integrity). Декларативная целостность обеспечивает и непротиворечивость данных в базе данных — в случае правильного проектирования базы данных.

Декларативная целостность базы данных обеспечивается системой управления базами данных. Система отменяет все попытки добавления и изменения данных, которые нарушают заданную средствами операторов DDL-целостность (т. е. непротиворечивость) данных — в базу данных не может быть помещена строка таблицы, чей внешний ключ не соответствует ни одному значению первичного или уникального ключа родительской таблицы, на который ссылается этот внешний ключ (о DDL читайте далее в этой главе). Нельзя также внести изменение в существующую строку таблицы, если изменяемое значение нарушает целостность данных.

Ограничения таблицы

Первичные, уникальные и внешние ключи таблиц называются ограничениями (constraint) таблицы. Кроме них существуют:

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

  • значение по умолчанию. Это ограничение DEFAULT. Если при добавлении в таблицу новой строки не было задано значение какого-то столбца, то ему будет присвоено значение по умолчанию. Если при описании столбца не было явно указано значение по умолчанию (ограничение DEFAULT), то этим значением является NULL. Значение по умолчанию используется только при добавлении новой строки в таблицу, но не при изменении значений данных существующей строки;

  • допустимость для столбца значения NULL. Предложение NOT NULL в описании столбца запрещает помещать в этот столбец значение NULL

  • Похожие новости

    Комментариев 0

    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.