在阅读了许多博客之后,我决定创建一个guid/UNIQUEIDENTIFIER作为主键的表,但是使用一个非聚集索引和一个bigint作为聚集键。
首先,在这个场景中,正确的DDL语法是什么。此外,我认为使用bigints作为外键将是正确的选择。这是正确的吗?
这里有一个十人的入门:
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发布于 2015-11-10 10:56:56
实际上,在默认情况下创建表时,主键是作为聚集索引创建的。但是您可以创建非聚集主键,并在另一列上添加聚集索引。语法如下:
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
如果在相同的键列上定义聚集索引(主键约束的默认值),则代理键的存储需求可能会产生级联效应。聚集索引键列在内部被所有非聚集索引用作查找表中行的方法。因此,如果在列x上定义聚集索引,在列a、b和c上定义非聚集索引,则非聚集索引分别在列(a,x)、(b、x)和(c,x)上创建。
除非您真的需要这样的PK(例如,在分布式系统中,当您需要跨几个系统的惟一性时),我不建议使用guids作为PK,至少在操作表中是这样。
https://stackoverflow.com/questions/33627990
复制相似问题