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
4

1 回答 1

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
于 2012-07-12T06:55:28.993 回答