更改SQL Server表以使用GUID作为主键

时间:2014-07-02 01:07:44

标签: sql-server

我有这张桌子:

CREATE TABLE [dbo].[Test] (
    [TestId]       INT              IDENTITY (1, 1) NOT NULL,
    [StatusId]     INT              NOT NULL,
    [Text]         NVARCHAR (400)  NULL,
    [TestUId]      UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL
);

GO
CREATE NONCLUSTERED INDEX [Test_TestUId_IX]
    ON [dbo].[Test]([TestUId] ASC);

如何更改此选项以使用GUID作为主键并在TestId上有索引?

3 个答案:

答案 0 :(得分:1)

明确命名约束以便于后续表更改是一种很好的做法。我建议您使用NEWSEQUENTIALID()而不是NEWID(),因为增量键将提高大表的性能。下面是一个示例,假设您需要聚簇主键索引。

DECLARE 
    @ConstraintName sysname
    ,@SQL nvarchar(MAX);
SELECT @ConstraintName = name
FROM sys.objects
WHERE parent_object_id = OBJECT_ID(N'Test')
AND type = 'PK';
SET @SQL = N'ALTER TABLE dbo.Test
    DROP CONSTRAINT ' + QUOTENAME(@ConstraintName) + ';';
EXEC sp_executesql @SQL;
ALTER TABLE dbo.Test
    ADD CONSTRAINT PK_Test PRIMARY KEY CLUSTERED (TestUId);
DROP INDEX dbo.Test.index_TestId;
CREATE UNIQUE INDEX index_TestId ON Test (TestId);

答案 1 :(得分:1)

只需更改表并将TestUId设为主键即可。如果要为主键定义聚簇索引,请删除现有的聚簇索引。

ALTER TABLE Test
ADD CONSTRAINT PK_Test PRIMARY KEY CLUSTERED (TestUId)

答案 2 :(得分:-1)

您可以在创建表时建立主键,然后添加其他索引。

CREATE TABLE [dbo].[Test] (
    [TestId] INT IDENTITY (1, 1) NOT NULL,
    [StatusId] INT NOT NULL,
    [Text]  NVARCHAR (400) NULL,
    [TestUId] UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    PRIMARY KEY ([TestUId])
)
CREATE INDEX index_TestId ON Test (TestId)