“创建表”语法显然不允许我指定集群外键约束。换句话说,这是非法的:
--keyword CLUSTERED must be removed before this will execute...
CREATE TABLE [Content](
[ID] [int] NOT NULL CONSTRAINT PK_Content_ID PRIMARY KEY,
ContentDefID int NOT NULL CONSTRAINT FK_Plugin_ContentDef FOREIGN KEY CLUSTERED REFERENCES ContentDef(ID)
)
GO
但我不明白为什么它是非法的。集群外键的 ISTM 将促进分页查找的性能。换句话说,“给我父 ID 20 的子项 80 到 140”。
这有什么理由吗?
更新
根据 Oded 和 Tvanfosson 的反馈,我发现以下工作:
CREATE TABLE [Content](
[ID] [int] NOT NULL CONSTRAINT PK_Content_ID PRIMARY KEY,
ContentDefID int NOT NULL UNIQUE CLUSTERED CONSTRAINT FK_ContentDefContent FOREIGN KEY REFERENCES ContentDef(ID)
)
GO
但上述问题导致的问题多于解决的问题。首先,“唯一”外键迫使我的关系是一对一的,这是我不想要的。其次,这只有效,因为它表示创建两个单独的约束,而不是单个 CLUSTERED FOREIGN KEY。
但这项调查让我更接近我的答案。显然聚集索引必须是唯一的,如此处所述。报价:
如果聚集索引不是唯一索引,则 SQL Server 通过添加一个内部生成的值(称为唯一符)使任何重复键唯一
特别是,我认为这个答案涵盖了它。