阅读了很多博客后,我决定创建一个以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
答案 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
,至少在操作表。