2010-05-14 4 views
21

В основном я хочу использовать uniqueidentifier аналогично идентификатору. Я не хочу вставлять в него значения, он должен просто вставлять значения автоматически, различное значение для каждой строки. Я не могу установить автоинкремент на столбцах типа uniqueidentifier (свойство «autoincrement» установлено в false и не редактируется).Autoincrement uniqueidentifier

ответ

27

Или еще лучше: используйте столбец UNIQUEIDENITIFER по умолчанию как newsequentialid(). Это даст вам несколько последовательных серий GUID.

CREATE TABLE dbo.YourTable 
    (SerialID UNIQUEIDENTIFIER 
     CONSTRAINT DF_SerialID DEFAULT newsequentialid(), 
    .... (other columns)...... 
    ) 

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

UPDATE:, как представляется, признанная ошибка в SQL Server Management Studio, предотвращающий с указанием newsequentialid() по умолчанию для столбца в интерактивном конструкторе таблиц.

См: http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/cad8a4d7-714f-44a2-adb0-569655ac66e6

Временное решение: создать таблицу без указания каких-либо значение по умолчанию, а затем введите в этом T-SQL заявление в обычном окне запроса и запустить его:

ALTER TABLE dbo.YourTable 
    ADD CONSTRAINT DF_SerialID DEFAULT newsequentialid() FOR SerialID 

Это должно сделать обмануть!

+0

Это не проблема для меня. Ваш ответ кажется тем, что я искал. Я попытаюсь это сделать :) – drasto

+0

У меня «Ошибка проверки по умолчанию для столбца XY». Не могли бы вы контролировать свой код (опечатка?)? – drasto

+0

@drasto: Я запустил этот код на SQL Server 2008 R2, прежде чем опубликовать его - он работает. Какую * версию * SQL Server у вас есть ??? Я удалил дополнительные скобки вокруг newsequentialid() - может быть, это проблема? Действительно работает на 2008R2 –

3

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

+0

они не совсем рядом с последовательным/автоинкрементным g, хотя ..... –

+0

Я пробовал это, но, похоже, генерирует всегда тот же идентификатор (этот: «00000000-0000-0000-0000-000000000000»). Поэтому при вставке второй строки я получаю ошибку (привязка для вставки первичного ключа, который уже используется) – drasto

+0

вы должны установить newId() непосредственно в определении таблицы в своей базе данных! – MUG4N

6

Я думаю, вы имеете в виду в SQLServer, а не C# ...

Установите столбец как PRIMARY KEY и ROWGUID

RowGuid http://img341.imageshack.us/img341/8867/sqlserverrowguid.png

+2

просто убедитесь, что ** NOT ** используйте, сделайте его кластеризованным индексом на столе !! –

+0

Почему бы и нет? Я использую его в проекте и отлично работает, все выглядит нормально, проверяет план выполнения, упорядочивает таблицы, все нормально ... – BrunoLM

+1

GUID как кластерный индекс ужасно плохой: посмотрите http: //www.sqlskills. com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs andor-the-clustering-key.aspx - они приводят к массивной фрагментации страниц и индексов –

2

Я думаю

CREATE TABLE dbo.YourTable 
(
    SerialID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT newsequentialid() 
) 

является проще