В системах управления реляционными базами данных уникальный ключ является потенциальным ключом . Все потенциальные ключи отношения могут однозначно идентифицировать записи отношения, но только один из них используется в качестве первичного ключа отношения. Остальные потенциальные ключи называются уникальными ключами, поскольку они могут однозначно идентифицировать запись в отношении. Уникальные ключи могут состоять из нескольких столбцов. Уникальные ключи также называются альтернативными ключами . Уникальные ключи являются альтернативой первичному ключу отношения. В SQL уникальным ключам назначено UNIQUE
ограничение для предотвращения дубликатов (повторяющаяся запись недопустима в уникальном столбце). Альтернативные ключи могут использоваться как первичный ключ при выполнении выбора из одной таблицы или при фильтрации в предложении where , но обычно не используются для объединения нескольких таблиц.
Ключи предоставляют пользователям базы данных и прикладному программному обеспечению средства для идентификации, доступа и обновления информации в таблице базы данных. В любой данной таблице может быть несколько ключей. Например, в таблице сотрудников и номер сотрудника, и имя пользователя являются индивидуально уникальными. Обеспечение ограничения ключа (т. е. ограничения уникальности) в таблице также является функцией целостности данных базы данных. СУБД предотвращает обновления, которые могут привести к дублированию значений ключей, и тем самым гарантирует, что таблицы всегда соответствуют желаемым правилам уникальности. Поэтому правильный выбор ключей при проектировании базы данных является важным аспектом целостности базы данных.
Таблица реляционной базы данных может иметь один или несколько доступных уникальных ключей (формально называемых потенциальными ключами ). Один из этих ключей для каждой таблицы может быть назначен первичным ключом ; другие ключи называются альтернативными ключами .
Любой ключ может состоять из одного или нескольких атрибутов. Например, номер социального страхования может быть одним атрибутивным ключом для сотрудника; комбинация номера рейса и даты может быть ключом, состоящим из двух атрибутов для запланированного рейса.
При моделировании и реализации баз данных используются несколько типов ключей .
В самом простом определении «ключ — это уникальный идентификатор», [1] поэтому уникальный ключ — это плеоназм . Ключи, которые находятся в пределах своей исходной сущности, уникальны в пределах этой сущности. Ключи, которые мигрируют в другую сущность, могут быть или не быть уникальными, в зависимости от дизайна и того, как они используются в другой таблице. Внешние ключи могут быть первичным ключом в другой таблице; например, PersonID может стать EmployeeID в таблице Employee. В этом случае EmployeeID является как внешним ключом, так и уникальным первичным ключом, что означает, что таблицы имеют отношение 1:1. В случае, когда сущность person содержала идентификатор биологического отца, идентификатор отца не должен быть уникальным, поскольку у отца может быть более одного ребенка.
Вот пример того, как первичный ключ становится внешним ключом в связанной таблице. ID переносится из таблицы Author в таблицу Book.
Схема таблицы авторов : Автор ( ID , Имя , Адрес , Дата рождения ) Схема таблицы книг : Книга ( ISBN , AuthorID , Название , Издатель , Цена )
Здесь ID служит первичным ключом в таблице «Автор», но также AuthorID служит внешним ключом в таблице «Книга». Внешний ключ служит связью, а значит, и соединением между двумя связанными таблицами в этом образце базы данных.
В реляционной базе данных потенциальный ключ однозначно идентифицирует каждую строку значений данных в таблице базы данных. Потенциальный ключ состоит из одного столбца или набора столбцов в одной таблице базы данных. Никакие две отдельные строки или записи данных в таблице базы данных не могут иметь одинаковое значение данных (или комбинацию значений данных) в этих столбцах потенциального ключа, поскольку значения NULL не используются. В зависимости от ее конструкции, таблица базы данных может иметь много потенциальных ключей, но не более одного потенциального ключа может быть выделено как первичный ключ.
Ограничение ключа применяется к набору кортежей в таблице в любой заданный момент времени. Ключ не обязательно является уникальным идентификатором среди всех возможных экземпляров кортежей, которые могут храниться в таблице, но он подразумевает правило целостности данных, согласно которому дубликаты не должны допускаться в таблице базы данных. Некоторые возможные примеры ключей — номера социального страхования , ISBN , регистрационные номера транспортных средств или имена пользователей.
В принципе, внешние ключи могут ссылаться на любой ключ. Некоторые СУБД SQL допускают ограничение внешнего ключа только по первичному ключу, но большинство систем разрешают ограничение внешнего ключа ссылаться на любой ключ таблицы.
Определение ключей в SQL:
ALTER TABLE < идентификатор таблицы > ADD [ CONSTRAINT < идентификатор ограничения > ] { PRIMARY KEY | UNIQUE } ( < имя столбца > [ { , < имя столбца > } ... ] )
Аналогично ключи могут быть определены как часть CREATE TABLE
оператора SQL.
CREATE TABLE table_name ( id_col INT , col2 CHARACTER VARYING ( 20 ), key_col SMALLINT NOT NULL , ... CONSTRAINT key_unique UNIQUE ( key_col ), ... )
CREATE TABLE table_name ( id_col INT PRIMARY KEY , col2 CHARACTER VARYING ( 20 ), ... key_col SMALLINT NOT NULL UNIQUE , ... )
Ограничение первичного ключа
Уникальное ограничение
Обратите внимание, что в отличие от ограничения PRIMARY KEY ограничение UNIQUE не подразумевает NOT NULL для столбцов, участвующих в ограничении. NOT NULL должно быть указано, чтобы сделать столбец(ы) ключом. Можно наложить ограничения UNIQUE на столбцы, допускающие значение NULL, но стандарт SQL гласит, что ограничение не гарантирует уникальность столбцов, допускающих значение NULL (уникальность не обеспечивается для строк, где любой из столбцов содержит значение NULL).
Согласно стандарту SQL [2], уникальное ограничение не обеспечивает уникальности при наличии значений NULL и, следовательно, может содержать несколько строк с идентичными комбинациями значений NULL и не NULL — однако не все СУБД реализуют эту функцию в соответствии со стандартом SQL. [3] [4]