![](/img/trans.png)
[英]Non-clustered GUID primary key OR clustered int primary key and GUID secondary key with unique index?
[英]using bigint as non clustered key and guid/UNIQUEIDENTIFIER as primary key non clustered
閱讀了許多博客之后,我決定創建具有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
實際上,默認情況下在創建表時,主鍵會創建為聚簇索引。 但是,您可以創建非集群主鍵,並在另一列上添加集群索引。 語法為:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.