簡體   English   中英

SQL Server在nvarchar列上創建聚簇索引,強制排序

[英]SQL Server create clustered index on nvarchar column, enforce sorting

我想要一個有兩列[Id] [bigint][Name] [nvarchar](63)的小表。 該列用於標簽,它將包含所有存在的標簽。 我想通過“名稱”列強制按字母順序排序,以便更快地找到給定標記。

必要的要點是:

  1. Id是我的主鍵,例如用於外鍵。
  2. 名稱也是唯一的。
  3. 我想按名稱按字母順序排序。
  4. 由於使用腳本創建表,因此需要SQL命令來創建約束。

我知道您可以使用聚集索引對表進行排序,但是我知道表不一定按該順序排序。

我的查詢如下所示,但我不了解如何在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)
);

在列名之后(在鍵/索引聲明內)還要指定ASCDESC設置索引排序順序。 默認值通常是升序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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