设置外键时需要手动创建索引吗?
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
.
上的删除操作的性能,则需要自己对其进行索引
我的 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
.