我的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
吗?
答案 0 :(得分:2)
是的,是的。此外键建立约束,使Phrase
必须具有有效PhraseCategory
。删除类别后,将删除PhraseCategory
,检查Phrase
表以确认没有"孤儿" Phrase
已离开。
虽然外键必须始终引用唯一值(通过显式约束或主键),但引用字段不必是索引,因此您需要如果您关心PhraseCategory
上的删除操作的性能,请自行编制索引。