Microsoft SQL 服务器 - 如何仅在插入时强制执行外键但允许保留孤立的外键?
Microsoft SQL Server - how to only enforce foreign key upon insertion but allow for orphan foreign keys to remain?
以下是用于本地开发的技术:
- Microsoft SQL Server 2016 网络版
假设我有以下 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 条目)
有人可以告诉我我需要进行哪些确切修改以确保满足上述要求吗?
大多数人遵循两种策略:
更改 CarTable 使其具有一列 "IsInactive"。这允许您将记录标记为 "Deleted" 而无需删除它们。这允许您使用正常的外键来确保完整性。当然,这意味着你需要相应地编程,只显示未删除的(IsInactive=False)记录。
不要使用外键来保证参照完整性。相反,使用 "on insert" 触发器来查找(伪)FK 记录并抛出错误以强制执行参照完整性。我想大多数 DBA 会告诉你这是个坏主意,你应该坚持#1。
方法 #2 的缺点是,一旦您删除了引用的记录,您就无法分辨它曾经是什么,也无法恢复它。使用方法 #1,您只需要编写程序来过滤掉不活动的记录,但如果确实需要,您可以随时查找它们。
以下是用于本地开发的技术:
- Microsoft SQL Server 2016 网络版
假设我有以下 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 条目)
有人可以告诉我我需要进行哪些确切修改以确保满足上述要求吗?
大多数人遵循两种策略:
更改 CarTable 使其具有一列 "IsInactive"。这允许您将记录标记为 "Deleted" 而无需删除它们。这允许您使用正常的外键来确保完整性。当然,这意味着你需要相应地编程,只显示未删除的(IsInactive=False)记录。
不要使用外键来保证参照完整性。相反,使用 "on insert" 触发器来查找(伪)FK 记录并抛出错误以强制执行参照完整性。我想大多数 DBA 会告诉你这是个坏主意,你应该坚持#1。
方法 #2 的缺点是,一旦您删除了引用的记录,您就无法分辨它曾经是什么,也无法恢复它。使用方法 #1,您只需要编写程序来过滤掉不活动的记录,但如果确实需要,您可以随时查找它们。