Microsoft SQL 服务器 - 如何仅在插入时强制执行外键但允许保留孤立的外键?

Microsoft SQL Server - how to only enforce foreign key upon insertion but allow for orphan foreign keys to remain?

以下是用于本地开发的技术:

假设我有以下 table 称为 CarCompanyTable

create table CarCompanyTable(

[CarCompanyid] uniqueidentifier DEFAULT newsequentialid() NOT NULL,
    [CarCompanyName] [nvarchar](200) NOT NULL,
   [AddressOfLocation] [nvarchar](200) NOT NULL,
  CONSTRAINT [PK_CarCompanyid] PRIMARY KEY CLUSTERED (CarCompanyid)
);

假设我有另一个 table 叫做 CarTable

create table CarTable(

[CarId] uniqueidentifier DEFAULT newsequentialid() NOT NULL,

[CarName] [nvarchar](200) NOT NULL,
[FKCarCompanyid] uniqueidentifier,

CONSTRAINT [PK_CarId] PRIMARY KEY CLUSTERED (CarId),
 CONSTRAINT [FK_CarCompanyTableCarTable] FOREIGN KEY(FKCarCompanyid) REFERENCES [dbo].[CarCompanyTable] (CarCompanyid),
);

如何以

这样的方式强制执行外部约束

1) 在向 CarTable 中插入新条目时检查 CarCompanyid 外键是否存在

2) 但是,允许存在孤立的 CarCompanyid 外键,以防从 CarCompanyTable 中删除 CarCompanyTable 条目(具有相应的 CarTable 条目)

有人可以告诉我我需要进行哪些确切修改以确保满足上述要求吗?

大多数人遵循两种策略:

  1. 更改 CarTable 使其具有一列 "IsInactive"。这允许您将记录标记为 "Deleted" 而无需删除它们。这允许您使用正常的外键来确保完整性。当然,这意味着你需要相应地编程,只显示未删除的(IsInactive=False)记录。

  2. 不要使用外键来保证参照完整性。相反,使用 "on insert" 触发器来查找(伪)FK 记录并抛出错误以强制执行参照完整性。我想大多数 DBA 会告诉你这是个坏主意,你应该坚持#1。

方法 #2 的缺点是,一旦您删除了引用的记录,您就无法分辨它曾经是什么,也无法恢复它。使用方法 #1,您只需要编写程序来过滤掉不活动的记录,但如果确实需要,您可以随时查找它们。