我想要一张包含两列[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
修改
我决定遵循paparazzo的建议。因此,如果您遇到同样的问题,请务必阅读他的答案。
答案 0 :(得分:2)
你应该不做你想做的事。
让Id标识成为集群PK。它(在正常使用下)不会碎片化。
表没有自然顺序。您必须sort by
才能获得订单。是的数据通常以PK顺序显示,但这只是查询优化器可能使用或不使用的便利。
只需在Name
上放置一个非群集的唯一索引,然后在select
中按其排序。
你真的需要bigint吗?这是一张庞大的表格。
答案 1 :(得分:1)
您可以在将主键声明为约束时指定主键为shell_exec("node notams.js");
,然后可以将唯一键声明为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
设置索引排序顺序。默认值通常是升序。