Значение первичного ключа для Microsoft SQL Server 2008 - PullRequest
3 голосов
/ 15 февраля 2010

Какое значение имеет понятие первичного ключа для ядра базы данных SQL Server? Я не имею в виду кластеризованный / некластеризованный индекс, созданный для столбца "ID", я имею в виду объект ограничения "первичный ключ" Имеет ли значение, существует он или нет?

Альтернативы:

  1. изменить таблицу добавить первичный ключ кластеризованный
  2. изменить таблицу создать кластерный индекс

Имеет ли это значение?

Ответы [ 2 ]

6 голосов
/ 15 февраля 2010

Как правило, KEY - это столбец (или комбинация столбцов), который уникально идентифицирует каждую строку в таблице. Можно иметь несколько ключей в таблице (например, у вас может быть таблица Person, в которой оба номера социального страхования, а также автоматически увеличивающееся число являются ключами).

Разработчик базы данных выбирает один из этих КЛЮЧЕЙ как ПЕРВИЧНЫЙ КЛЮЧ. Концептуально, не имеет значения , какой КЛЮЧ выбран в качестве ПЕРВИЧНОГО КЛЮЧА. Однако, поскольку PRIMARY KEY обычно используется для ссылки на записи в этой таблице из других таблиц (через FOREIGN KEYs), выбор хорошего PRIMARY KEY может быть уместным w.r.t. (а) производительность и (б) ремонтопригодность :

(a) Поскольку первичный ключ обычно используется в соединениях, индекс первичного ключа (его размер, распределение и т. Д.) Гораздо более важен для производительности, чем другие индексы.

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

4 голосов
/ 15 февраля 2010

ПЕРВИЧНЫЙ КЛЮЧ - это ограничение - это логический объект, который говорит о правилах, которых должны придерживаться ваши данные. Индекс - это структура доступа - он говорит о том, как машина может искать данные. Для реализации PRIMARY KEY большинство СУБД использует индекс.

Некоторые СУБД (например, MySQL) не проводят различия между ограничением PRIMARY KEY или UNIQUE и индексом, который используется для его реализации. Но, например, Oracle делает: в оракуле вы можете сделать что-то вроде: ALTER TABLE t DROP pk KEEP INDEX. Это полезно, если вы хотите изменить определение первичного ключа (например, вы заменяете естественный первичный ключ суррогатным первичным ключом), но по-прежнему хотите иметь уникальное ограничение на исходные столбцы первичного ключа без перестройки индекса , Это имеет смысл, если индекс очень большой и потребует значительной таблицы и ресурсов для перестройки.

Из того, что я вижу, MS SQL не делает различий. Я имею в виду, что такой инструмент, как Management Studio, отображает «Ключи», «Индексы» и «Ограничения» в разных папках, но изменение имени одной немедленно меняет имя соответствующих объектов в других папках. Поэтому я думаю, что в данном случае различие на самом деле отсутствует.

...