В чем разница между первичным ключом и ограничением уникального ключа? - PullRequest
20 голосов
/ 29 сентября 2010

В чем разница между Primary key и unique Key constraint?

Какая от этого польза ??

Ответы [ 5 ]

12 голосов
/ 29 сентября 2010

Оба используются для обозначения ключей-кандидатов для таблицы.

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

Любой может использоваться в ограничениях внешнего ключа.В SQL Server столбцы первичного ключа не могут быть обнуляемыми.Столбцы, используемые в ограничениях уникального ключа, могут быть.

По умолчанию в SQL Server первичный ключ становится кластеризованным индексом, если он создается в куче, но это ни в коем случае не обязательно, чтобы PK и кластерный индексто же самое.

7 голосов
/ 29 сентября 2010

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

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

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

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

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

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

  2. Скорость поиска.Эффективность ключа может быть важна, так как они используются во многих WHERE предложениях и (чаще) во многих JOIN s.В частности, JOINS скорость поиска может быть жизненно важной.Воздействие будет зависеть от деталей реализации, и разные базы данных различаются в зависимости от того, как они будут обрабатывать разные типы данных (у меня было бы немного сомнений с точки зрения производительности при использовании большого фрагмента текста в качестве первичного ключа в Postgres, где я мог бы указать использованиехэш присоединяется, но я бы очень не решался сделать это в SQLServer [Правка: для «большого» я ​​думаю о размере имени пользователя, а не о размере всего скандинавского Eddas!]).

  3. Частота ключа - единственные интересные данные. Например, с таблицей языков и таблицей комментариев на этом языке очень часто единственной причиной, по которой я хотел бы присоединиться к языковой таблице при работе с таблицей комментариев, является либо получение кода языка, либо ограничение запрос для тех, кто с определенным языковым кодом. Другая информация о языке, вероятно, будет использоваться гораздо реже. В этом случае объединение по коду, вероятно, будет менее эффективным, чем присоединение по числовому идентификатору, установленному из столбца IDENTITY, с кодом в качестве первичного ключа и, следовательно, с тем, что хранится в столбце внешнего ключа в комментариях таблица - устранит необходимость в любом СОЕДИНЕНИИ со значительным приростом эффективности. Чаще всего я хочу получить больше информации из соответствующих таблиц, поэтому более важно сделать JOIN более эффективным.

5 голосов
/ 29 сентября 2010

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

  1. Первичный ключ - это ничто, но он уникально идентифицирует каждую строку в таблице.

  2. Первичный ключ не допускает дублирования значений, а также NULL.

  3. Первичный ключ по умолчанию является кластеризованным индексом.

  4. Таблица может иметьтолько один первичный ключ.

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

  1. Уникальный ключ - ничто, но он уникально идентифицирует каждую строку втаблица.

  2. Уникальный ключ не допускает дублирования значений, но допускает (не более одного) NULL.

  3. Уникальный ключ по умолчаниюявляется некластеризованным индексом.

Это полная ссылка для понимания Первичного ключа Ключи базы данных. Имейте в виду, у нас есть только один кластеризованный индекс в таблице [Говоря о SQL Server 2005].Теперь, если мы хотим добавить еще один уникальный столбец, мы будем использовать столбец Уникальный ключ , поскольку в столбец Уникальный ключ можно добавить более одного.

3 голосов
/ 30 сентября 2010

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

Однако SQL имеет два разных синтаксиса для реализации ключей-кандидатов: ограничение PRIMARY KEY и ограничение UNIQUE (конечно, для столбцов, не допускающих значения NULL). На практике они достигают абсолютно одного и того же, за исключением практически бесполезного ограничения, что PRIMARY KEY может использоваться только один раз для каждой таблицы, тогда как ограничение UNIQUE может использоваться несколько раз.

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

1 голос
/ 29 сентября 2010

Короткая версия:

  • С точки зрения теории баз данных их нет. Оба - просто ключи-кандидаты.
  • На практике большинству DMBS нравится иметь один «стандартный ключ», который можно использовать, например, для решить, как хранить данные, и сообщить инструментам и клиентам БД, как лучше всего идентифицировать запись.

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

...