2012-03-07 3 views
4

Поскольку первичный ключ и уникальный подобный. Мне трудно понять концепцию этих двух. Я знаю, что первичный ключ не принимает null, а уникальный ключ принимает null один раз. Поскольку нулевое значение является уникальным значением, поэтому его можно принять только один раз. Но идея первичного ключа имеет уникальность в каждой строке. который также делает уникальный ключ. вот почему я спрашиваю, когда правильно использовать первичный ключ по уникальному ключу и наоборот.Когда нужно использовать уникальный ключ в таблице, чем первичный ключ?

+1

«уникальный ключ принимает null один раз»: это не так. Кроме того, я думаю, вы должны прочитать некоторые ресурсы в Интернете, нелегко суммировать концепции в одном сообщении StackOverflow. –

+0

Я задал этот вопрос, потому что у меня проблемы с поиском сценария в моей голове, где я бы использовал уникальный ключ. Могу ли я иметь пустой мозг, поэтому я не могу найти его! Haha –

+0

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

ответ

5

УНИКАЛЬНОЕ ограничение похоже на ключ PRIMARY, но вы можете иметь более одного УНИКАЛЬНОГО ограничения на таблицу.

Когда вы объявляете ограничение UNIQUE, SQL Server создает индекс UNIQUE, чтобы ускорить процесс поиска дубликатов. В этом случае индекс по умолчанию имеет индекс NONCLUSTERED, потому что вы можете иметь только один индекс CLUSTERED для каждой таблицы.

  • Число ограничений UNIQUE на таблицу ограничено количеством индексов на таблице i.e 249 НЕРАСПРОСТРАНЕННЫЙ индекс и один возможный индекс CLUSTERED.

В отличие от ключа PRIMARY UNIQUE ограничения могут принимать NULL, но только один раз. Если ограничение определено в комбинации полей, то каждое поле может принимать NULL и может иметь некоторые значения на них, если значения комбинации уникальны.

См также другую ссылку (MSDN)

+1

УНИКАЛЬНЫЕ ограничения допускают значение NULL. Однако, как и при любом значении, участвующем в ограничении UNIQUE, допускается только одно значение null для столбца. (http://msdn.microsoft.com/en-us/library/ms191166.aspx) –

+0

Это странно и довольно неожиданно, учитывая, что 'null = x' никогда не является истинным для любого' x' (или SQL Server нарушает это слишком?). Спасибо за поддержку документации. –

+2

@muistooshort: да, SQL Server лихо оценил это неправильно. В стандартном SQL ограничение UNIQUE не нарушается несколькими нулями. Обратите внимание на неверное представление «только одно нулевое значение» (подсказка: null не является значением, стандарт SQL относится к «** ** значение null»), что, вероятно, говорит. – onedaywhen

0

Таблица может иметь несколько уникальный ключ, но только один первичный ключ разрешен для таблицы. ЕСЛИ ваш уникальный ключ НЕ УНИКАЛЬНЫЙ КЛЮЧ, но это всегда хорошая идея, чтобы продвигать его в PRIMARY KEY. Если ваш механизм хранения - INNODB, и если у вас нет ключа PRIMARY, тогда innodb автоматически создает внутренний ключ HEXDECIMAL PRIMARY, который будет иметь некоторое влияние на производительность, поэтому лучше всегда создавать первичный ключ с движком хранения INNODB.

+0

«F ваш уникальный ключ - НЕИНУЛЬНЫЙ УНИКАЛЬНЫЙ КЛЮЧ, поэтому всегда рекомендуется продвигать его в PRIMARY KEY» - вы делаете убедительный пример для INNODB, но почему вы говорите ** всегда **? – onedaywhen

4

Краткое описание: Для каждой базовой таблицы важно иметь ключ, используя либо PRIMARY KEY, либо NOT NULL UNIQUE. Разница между ними не является реляционным соображением и не имеет значения с логической точки зрения; скорее, это всего лишь психологическое соображение.


relvar может иметь несколько ключей, но мы выбираем только один для подчеркивания и называют, что один первичный ключ. Выбор произволен, поэтому принципиальная концепция первичного не очень важна с логической точки зрения . Однако общая концепция ключа очень важна! Ключ-кандидат срока означает то же самое, что и ключ (т. Е. Добавление кандидата не имеет реального значения - оно было предложено Тедом Коддом , потому что он рассматривал каждый ключ в качестве кандидата для назначения в качестве первичного ключа ). SQL позволяет подмножество столбцов таблицы быть , объявленным как ключ для этой таблицы. Он также позволяет одному из них быть , номинированным как первичный ключ.Указание ключа, чтобы быть первичным делает для определенного удобства в связи с другими ограничениями, которые могут понадобиться

What Is a Key? by Hugh Darwen


это обычно ... выделить один ключ так как первичный ключ (и любые другие ключи для рассматриваемого рельва, как говорят, являются альтернативными ключами). Но следует ли выбрать какой-либо ключ как первичный, и если да, то какой-то являются по существу психологическими проблемами, выходящими за рамки реляционной модели как таковой. Как правило, большинство базовых relvars вероятно должны иметь первичный ключ, но, чтобы повторить это правило, , если это правило, действительно не является реляционной проблемой как таковой ... Strong рекомендация [ SQL-пользователи]. Для базовых таблиц, во всяком случае, используйте ОСНОВНЫЕ КЛЮЧИ и/или УНИКАЛЬНЫЕ спецификации, чтобы гарантировать, что каждая такая таблица имеет хотя бы один ключ.

SQL and Relational Theory: How to Write Accurate SQL Code К. Дж Дата


В стандартном SQL PRIMARY KEY

  • подразумевает уникальность, но вы можете указать, что явно (с помощью UNIQUE).
  • подразумевает NOT NULL но вы можете указать, что в явном виде при создании столбцов (но вы должны избегать аннулирует так или иначе!)
  • позволяет опустить ее столбцы в FOREIGN KEY, но вы можете указать их в явном виде.
  • может быть объявлен только для одного ключа в таблице, но непонятно, почему (Кодд, который первоначально предложил концепцию, не налагал такого ограничения).

В некоторых продуктах PRIMARY KEY предполагает кластерный индекс в таблицах, но вы можете указать, что явно (вы не можете первичный ключ, чтобы быть кластерным индексом!)

Для некоторых людей PRIMARY KEY имеет чисто психологическое значение:

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

PK считается уникальным идентификатором строки. Он никогда не должен подвергаться изменениям. Например, идентификатор пользователя.

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