[英]SQL Server create clustered index on nvarchar column, enforce sorting
我想要一個有兩列[Id] [bigint]
和[Name] [nvarchar](63)
的小表。 該列用於標簽,它將包含所有存在的標簽。 我想通過“名稱”列強制按字母順序排序,以便更快地找到給定標記。
必要的要點是:
我知道您可以使用聚集索引對表進行排序,但是我知道表不一定按該順序排序。
我的查詢如下所示,但我不了解如何在Name上創建聚簇索引,但仍將Id保留為主鍵:
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Tags]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Tags]
(
[Id] [bigint] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Name] [nvarchar](63) NOT NULL,
CONSTRAINT AK_TagName UNIQUE(Name)
)
END
編輯:
我決定聽從狗仔隊的建議。 因此,如果您遇到相同的問題,請確保您也閱讀了他的答案。
你不應該做你想做的事。
令Id身份為聚類PK。 它(在正常使用下)不會碎裂。
表格沒有自然順序。 您必須sort by
才能得到訂單。 是的,數據通常以PK順序顯示,但這只是查詢優化器可能使用或可能不使用的一種便利。
只需在Name
上放置一個非聚集的唯一索引,然后在select
對其進行排序。
您真的需要bigint嗎? 那是一張大桌子。
在將其聲明為約束時,可以指定主鍵為NONCLUSTERED
,然后可以將唯一鍵聲明為CLUSTERED
索引。
CREATE TABLE [dbo].[Tags] (
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](63) NOT NULL,
CONSTRAINT PK_Tag PRIMARY KEY NONCLUSTERED (Id ASC),
CONSTRAINT AK_TagName UNIQUE CLUSTERED (Name ASC)
);
在列名之后(在鍵/索引聲明內)還要指定ASC
或DESC
設置索引排序順序。 默認值通常是升序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.