Рекомендуется ли использовать идентификатор в качестве альтернативы первичному ключу?

11

Мы можем объявить Identityкак, id_numтак что id_numбудет иметь приращение уникальных чисел.

CREATE TABLE new_employees
(
  id_num int IDENTITY(1,1),
  fname varchar (20),
  minit char(1),
  lname varchar(30)
)

Это рекомендуется использовать в Identityкачестве альтернативы , Primary keyтак как при Identityусловии , уникальный номер для каждой строки?

Джек
источник
Зачем тебе это нужно? потому что хорошо быть одним первичным ключом в таблице, он автоматически создает индекс кластера и хорош для оптимизации.
KuldipMCA
4
Нет, рекомендуется использовать IDENTITY в качестве первичного ключа (а не в качестве альтернативы PK). Это дает очень хороший, очень эффективный первичный ключ (который по умолчанию также является ключом кластеризации в SQL Server) - он узкий, обычно статический, обычно уникальный (если вы не играете со спецификацией идентификации), и он всегда увеличение
marc_s

Ответы:

23

Identity columnsи Primary Keysдве очень разные вещи. An Identity columnпредоставляет автоинкрементное число. Это все, что он делает. Primary Key(По крайней мере , в SQL Server) является ограничение уникальности , что гарантирует уникальность и, как правило (но не всегда) кластерный ключ. Опять же, в MS SQL Server это тоже индекс (в некоторых СУБД они не так тесно связаны). В качестве индекса он обеспечивает более быстрые поиски и т. Д. Часто Identity columnsиспользуются как, Primary Keyесли ничего хорошего не natural keyсуществует, но не являются заменой.

Кеннет Фишер
источник
1
В SQL Server некластеризованный индекс содержит первичный ключ на уровне листьев. Определение естественного ключа в качестве первичного ключа сделает ваши индексы очень большими.
Андомар
2
@ Andomar PK - это логическая сущность. Индекс поддержки для ПК является физическим. И некластеризованный индекс может поддерживать PK, не обязательно должен быть кластеризованным индексом. Следовательно, ваше утверждение неверно, если индекс PK является NCI. Это ключ кластеризованного индекса на уровне листа NCI.
Томас Стрингер
@ThomasStringer: Вы правы, мой комментарий должен прочитать clustered index keyтам, где он говорит primary key.
Андомар
Возможно. Ваш естественный ключ может быть целым числом, в этом случае нет никакой разницы. Количество аргументов, которые вы увидите в разделе «Искусственные против естественных», просто поражает. Попробуй поискать в интернете иногда :) Это просто один из аргументов в пользу искусственных ключей.
Кеннет Фишер
5

Нет, это не так, потому что личность не гарантирует уникальную ценность. Свойство identity можно обойти с помощью SET IDENTITY_INSERT <schema>.<table> ON(в SQL Server - вы не указали, какую СУБД вы используете).

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

Гринстоун Уолкер
источник
5
это не гарантирует уникальную ценность. Но больше ничего не делает. Любой, кто имеет доступ к базе данных, может попытаться вставить дубликаты значений в первичный ключ. Что делает личность, так это облегчает генерацию уникальных значений (особенно если у вас нет хорошего естественного ключа, как говорит Кеннет Фишер). Вы можете объявить целочисленное поле с первичным ключом, и это будет точно то же самое, но без автоматической генерации. Таким образом, IDENTITY для генерации, а ключ для обеспечения уникальности.
Крис Олдрич
+1 За указание на основной недостаток в помещении вопрос - Identityи Primary Keyне эквивалентны и служат двум разным целям.
JNK