以下是用于本地开发的技术:
- Microsoft SQL Server 2016 Web Edition
假设我有以下表,称为 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( 但是,允许存在孤立的 CarCompanyid 外键,以防从 CarCompanyTable 中删除 CarCompanyTable 条目(带有相应的 CarTable 条目(
有人可以告诉我为了确保满足上述要求而需要进行的确切修改吗?
大多数人遵循两种策略:
-
将 CarTable 更改为具有"IsInactive"列。 这允许您将记录标记为"已删除",而无需删除它们。 这允许您使用普通外键来确保完整性。 当然,这意味着您需要相应地编程,以仅显示未删除(IsInactive=False(的记录。
-
不要使用外键来实现引用完整性。相反,请使用"插入时"触发器查找(伪(FK 记录并引发错误以强制实施引用完整性。 我认为大多数DBA会告诉你这是一个坏主意,你应该坚持#1。
方法#2的缺点是,一旦删除引用的记录,就无法知道它以前是什么,也无法恢复它。 使用方法#1,您只需要编写程序来过滤掉非活动记录,但是如果您确实需要,您可以随时查找它们。