【问题标题】:Do I need to create an Index manually when setting up a foreign key?设置外键时是否需要手动创建索引?
【发布时间】:2016-09-07 05:53:57
【问题描述】:

我的 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 吗?

【问题讨论】:

    标签: sql-server foreign-keys ddl


    【解决方案1】:

    是的,是的。这个外键建立了一个约束,使得Phrase 必须有一个有效的PhraseCategory。当一个类别被删除时,PhraseCategory 被删除,Phrase 表被检查以验证没有留下“孤立”Phrases。

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

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2011-07-01
      • 2011-05-06
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多