Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microsoft SQL Server-如何仅在插入时强制执行外键,但允许保留孤立外键?_Sql_Constraints_Foreign Key Relationship_Orphan - Fatal编程技术网

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

Microsoft SQL Server-如何仅在插入时强制执行外键,但允许保留孤立外键?,sql,constraints,foreign-key-relationship,orphan,Sql,Constraints,Foreign Key Relationship,Orphan,以下是用于当地发展的技术: Microsoft SQL Server 2016 Web版 假设我有一个叫做CarCompanyTable的表 create table CarCompanyTable( [CarCompanyid] uniqueidentifier DEFAULT newsequentialid() NOT NULL, [CarCompanyName] [nvarchar](200) NOT NULL, [AddressOfLocation] [nvarcha

以下是用于当地发展的技术:

  • Microsoft SQL Server 2016 Web版
假设我有一个叫做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) 检查CartTable中的新插入条目是否存在CarCompanyid外键

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

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更改为具有列“IsInactive”。这允许您将记录标记为“已删除”,而无需删除它们。这允许您使用普通外键来保证完整性。当然,这意味着您需要进行相应的编程,以仅显示未删除的(IsInactive=False)记录

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


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

    大多数人都遵循两种策略:

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

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

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