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 に答える