设置外键时需要手动创建索引吗?

Do I need to create an Index manually when setting up a foreign key?

我的 SQL 服务器数据库中有这些模式:

CREATE TABLE [dbo].[Phrase] 
(
    [PhraseId]     UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [Text]         NVARCHAR (MAX)   NOT NULL,
    [CategoryId]   INT              DEFAULT ((1)) NOT NULL,

    PRIMARY KEY CLUSTERED ([PhraseId] ASC),

    CONSTRAINT [FK_PhrasePhraseCategory] 
         FOREIGN KEY ([CategoryId]) 
         REFERENCES [dbo].[PhraseCategory] ([PhraseCategoryShortId])
);

CREATE TABLE [dbo].[PhraseCategory] 
(
    [PhraseCategoryId]      UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [PhraseCategoryShortId] INT              IDENTITY (1, 1) NOT NULL,
    [Name]                  VARCHAR (20)     NOT NULL,

    PRIMARY KEY CLUSTERED ([PhraseCategoryShortId] ASC)
);

如果我转到 PhraseCategory table 并尝试删除一行,它会检查 PhraseCategoryShortId 是否在短语 table?如果是这种情况,那么我应该在 table 中索引 CategoryId 吗?

是的,是的。这个外键建立了一个约束,使得 Phrase 必须有一个有效的 PhraseCategory。删除类别时,删除 PhraseCategory,检查 Phrase table 以验证没有留下 "orphan" Phrase

虽然外键必须始终引用唯一值(通过显式约束或主键),但 referring 字段不必是索引,因此您如果您关心 PhraseCategory.

上的删除操作的性能,则需要自己对其进行索引