2011-01-15 5 views

ответ

4

Это GUID column. Это означает, что каждый раз, когда вы вставляете строку в эту таблицу, SQL Server будет генерировать новый GUID и помещать его в этот столбец . Это гарантирует уникальность значения и не только на этом компьютере, но и на всех компьютерах мира.


UPDATE:

Как отметил @tdammers в разделе комментариев новые идентификаторы GUID не автоматически генерируются при вставке строк, но этот эффект может быть достигнут путем определения newid() в качестве значения по умолчанию для столбца.

+1

Он автоматически не генерирует его, если вы не указали его. Вы можете установить по умолчанию для столбца GUID в 'newid()', чтобы автоматически генерировать новый GUID при вставке. – tdammers

+0

@tdammers, да очень хорошее замечание. Я уточню свой ответ. Спасибо за указание на это. –

2

A uniqueidentifier - это имя SQL-сервера для GUID (см. http://en.wikipedia.org/wiki/Globally_unique_identifier). Основная идея состоит в том, что GUID достаточно велик и имеет достаточно энтропии, чтобы сделать столкновения двух случайно генерируемых GUID крайне маловероятными. Чтобы еще больше уменьшить вероятность столкновений, большинство генераторов GUID включают некоторое значение, которое однозначно идентифицирует хост в процессе хеширования, такой как MAC-адрес первичного сетевого адаптера, и поддерживает машинный счетчик, чтобы избежать столкновений между идентификаторами GUID, сгенерированными на том же компьютере.

В SQL Server uniqueidentifier - это еще один тип данных, например int, varchar и т. Д., Но его характеристики делают его подходящим в качестве первичного ключа. Это намного больше, чем типичное целое число с автоматическим добавлением, но облегчает репликацию и миграцию - данные из двух ранее не связанных баз данных не будут приводить к коллизиям на первичных ключах, если вы используете GUID, потому что каждый GUID (концептуально) глобально уникален. При использовании автоматических инкрементных первичных ключей вы наверняка получите перекрытия, так как обе таблицы однажды начинаются с 1, а изменение значений первичного ключа означает, что вам также необходимо изменить любые значения внешнего ключа, ссылающиеся на эту запись. Это можно сделать, но это намного сложнее, чем просто использовать GUID.

1

Как уже упоминалось, и другие также указали, что тип данных GUID/uniqueidentifier на SQL Server, по-видимому, является отличным кандидатом на первичный ключ - позвольте мне предупредить вас о некоторых проблемах, которые у него есть, Возможно, вы позднее пожалеете:

Вам необходимо разделить первичный ключ , который является логической конструкцией - он однозначно идентифицирует ваши строки, он должен быть уникальным и стабильным, а NOT NULL. GUID хорошо работает и для первичного ключа, поскольку он гарантированно уникален. GUID в качестве основного ключа является хорошим выбором, если вы используете репликацию SQL Server, так как в этом случае вам нужен однозначно идентифицирующий столбец GUID.

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

Смотрите свои статьи на индексацию здесь:

, а также увидеть Джимми Нильссон The Cost of GUIDs as Primary Key

GUID, является ужасно плохой выбор для ключа кластеризации, поскольку он широкий, абсолютно случайный и, таким образом, приводит к плохой фрагментации индекса и низкой производительности. Кроме того, строки (-и) кластеризации также хранятся в каждой записи каждого некластеризованного (дополнительного) индекса, поэтому вы действительно хотите сохранить его маленьким - GUID равен 16 байт против INT 4 байт и с несколькими некластеризованными индексами и несколькими миллионами строк, это делает ОГРОМНОЕ различие.

В SQL Server ваш первичный ключ по умолчанию является ключом кластеризации, но это необязательно. Вы можете легко использовать GUID как ваш первичный ключ NON-Clustered и INT IDENTITY как ваш ключ кластеризации - вам просто нужно знать об этом.

Смежные вопросы