1

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

  • Microsoft SQL Server 2016 网络版

假设我有一个名为 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)
);

假设我有另一个名为 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) 检查 CarCompanyid 外键是否存在于 CarTable 中的新插入条目

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

有人可以告诉我为了确保满足上述要求而需要进行的确切修改吗?

4

1 回答 1

0

大多数人遵循两种策略:

  1. 将 CarTable 更改为具有“IsInactive”列。这允许您将记录标记为“已删除”而不删除它们。这允许您使用正常的外键来保证完整性。当然,这意味着您需要进行相应的编程,只显示未删除的(IsInactive=False)记录。

  2. 不要为参照完整性使用外键。相反,使用“on insert”触发器来查找(伪)FK 记录并引发错误以强制引用完整性。我认为大多数 DBA 会告诉您这是一个坏主意,您应该坚持使用 #1。

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

于 2017-07-12T17:09:32.320 回答