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

时间:2016-09-07 05:53:57

标签: sql-server foreign-keys ddl

我的SQL Server数据库中有这些架构:

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表并尝试删除一行,它会检查短语表中是否使用了PhraseCategoryShortId?如果是这种情况,那么我应该在该表中索引CategoryId吗?

1 个答案:

答案 0 :(得分:2)

是的,是的。此外键建立约束,使Phrase必须具有有效PhraseCategory。删除类别后,将删除PhraseCategory,检查Phrase表以确认没有"孤儿" Phrase已离开。

虽然外键必须始终引用唯一值(通过显式约束或主键),但引用字段不必是索引,因此您需要如果您关心PhraseCategory上的删除操作的性能,请自行编制索引。