2

我想爲將成爲PRIMARY KEY且屬於uniqueidentifier類型的表添加一列。我有這個,但是我想知道是否有更快的(更少的代碼行)方式?旅途中的新唯一標識

ALTER TABLE [table] ADD [id] [uniqueidentifier] 
    DEFAULT('00000000-0000-0000-0000-000000000000') NOT NULL 
GO  
UPDATE [table] SET [id] = NEWID() 
GO  
ALTER TABLE [table] ADD CONSTRAINT [PK_table_id] PRIMARY KEY CLUSTERED 
GO 
+2

你爲什麼不設置默認爲'NEWID()',而不是在兩個步驟做? - 因爲,大概你會希望新的行也能得到一個值)。另外,'NEWID()'和'CLUSTERED'往往不能很好地結合在一起。 – 2012-07-12 06:47:00

+0

實際上我從來沒有想過能夠將默認設置爲某個功能:O – 2012-07-12 06:48:44

+0

「Real-World Time」中的速度更快,或者「更少的行數」中的速度更快?如果是前者,你的目標時間是什麼,你有多遠? – 2012-07-12 06:49:18

回答

3

如果你想保持你的命名約束(你應該),我不認爲我們可以減少它低於2個語句:

create table T (
    Col1 varchar(10) not null 
) 
go 
insert into T (Col1) 
values ('abc'),('def') 
go 
ALTER TABLE T ADD [id] [uniqueidentifier] constraint DF_T_id DEFAULT(NEWID()) NOT NULL 
GO 
ALTER TABLE T ADD constraint PK_T PRIMARY KEY CLUSTERED (id) 
go 
drop table T 

。注意,我添加了一個名字爲默認約束。此外,這確保新行也有id值分配。正如我在我的評論中所說的那樣,通常最好避免將具有由NEWID()生成的值的列排在一起 - 這會導致大量碎片。如果你想避免這種情況,請考慮NEWSEQUENTIALID()

如果你不關心約束名,則可以做到這一點作爲一個單一的查詢:

ALTER TABLE T ADD [id] [uniqueidentifier] DEFAULT(NEWID()) NOT NULL PRIMARY KEY CLUSTERED 
+0

Remus Rusanu建議NEWID()+ clustered = BAD。你能說一句話嗎? – 2012-07-12 06:59:58

+0

@AndriusNaruševičius - 我已經提到了兩次,並在第二段末尾包含了一個建議的替換。 – 2012-07-12 07:01:04

+0

我也見過'[id] [uniqueidentifier] ROWGUIDCOL NOT NULL' - 它的工作方式與NEWID()還是NEWSEQUENTIALID()相同或者與它們不同? – 2012-07-12 07:03:21