簡體   English   中英

使用bigint作為非聚集鍵,並且將guid / UNIQUEIDENTIFIER用作非聚集主鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM