使用bigint作为非聚簇键,使用guid / UNIQUEIDENTIFIER作为非聚簇的主键

时间:2015-11-10 10:34:17

标签: sql-server tsql sql-server-2014

阅读了很多博客后,我决定创建一个以guid / UNIQUEIDENTIFIER作为主键的表,但是使用非聚簇索引和bigint作为聚簇键。

首先,在这种情况下,正确的DDL语法是什么。另外,我认为使用bigint作为外键将是正确的选择。这是对的吗?

以下是十人的首发:

IF OBJECT_ID('dbo.Table1', 'U') IS NOT NULL
  DROP TABLE dbo.Table1; 

CREATE TABLE dbo.Table1
(
    [Table1Id] [BIGINT] IDENTITY(1,1) NOT NULL,
    [Table1Guid] [UNIQUEIDENTIFIER] NOT NULL,
    [PayLoad] NVARCHAR(200) NULL
PRIMARY KEY CLUSTERED 
(
    [Table1Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

CREATE NONCLUSTERED INDEX IX_Table1_Table1Guid
    ON dbo.Table1 (Table1Guid); 
GO

1 个答案:

答案 0 :(得分:1)

实际上,默认情况下创建表时,主键创建为聚簇索引。但您可以创建非聚簇主键并在另一列上添加聚簇索引。语法如下:

CREATE TABLE [dbo].[Table1](
    [Table1Id] [BIGINT] IDENTITY(1,1) NOT NULL,
    [Guid] [UNIQUEIDENTIFIER] NOT NULL,
    [PayLoad] NVARCHAR(200) NULL
) 
GO

ALTER TABLE [dbo].[Table1] ADD CONSTRAINT [PK_Table1] PRIMARY KEY NONCLUSTERED ([Guid])
GO

CREATE UNIQUE CLUSTERED INDEX IX_Table1_Table1Id ON dbo.Table1 (Table1Id)
GO

现在关于guid列的主键。由于需要空间,guid primary key通常是个坏主意。

取自Exam 70-461: Querying Microsoft SQL Server 2012

  

您的代理键的存储要求可以具有级联   如果您的聚簇索引在相同的键列上定义,则会生效   (主键约束的默认值)。聚集索引键   内部所有非聚簇索引都使用列作为方法   找到表中的行。因此,如果您在a上定义聚簇索引   列x和非聚簇索引 - 列a上的一个,b上的一个和一个   在c上你的非聚簇索引是在列内部创建的(a,   x),(b,x)和(c,x)。

除非您确实需要这样的PK(例如在分布式系统中,当您需要跨多个系统的唯一性时),我不建议将guids用作PK,至少在操作表。