sql-server – 双向外键约束

我正在考虑设计类似于以下内容数据库模式:
Person (
  PersonID int primary key,PrimaryAddressID int not null,...
)

Address (
  AddressID int primary key,PersonID int not null,...
)

Person.PrimaryAddressID和Address.PersonID将是相应表的外键.

显而易见的问题是,无法在任何一个表中插入任何内容.有没有办法设计一个工作模式来强制每个具有主要地址的人?

解决方法

“我认为这是不可能的.在知道人员的ID之前,你不能创建一个地址记录,直到你知道了PrimaryAddressId字段的AddressId后才能插入人员记录.”

从表面上看,这种主张似乎很有吸引力.但是,它很有创意.

这是一个非常常见的问题,sql DBMS供应商已经尝试攻击了几十年了.

关键是所有约束检查必须“延迟”,直到两个插入完成.这可以通过不同的形式实现.数据库事务可能会提供类似“设置延迟约束检查”的操作的可能性,并且您已经完成了(如果不是因为在这个特定的示例中,您可能必须非常努力地设计您的设计能够只定义两个FK约束,因为其中一个只是在sql意义上不是’真正的’FK!).

这里描述的基于触发器的解决方案实现了基本相同的效果,但是这些解决方案暴露于应用程序强制完整性所存在的所有维护问题.

在他们的作品中,Chris Date&休达文描述了什么是这个问题的真正解决方案:多重任务.也就是说,实质上是组合几个不同的更新语句并让DBMS对其进行操作的可能性,好像这是一个单一的语句.这个概念的实现确实存在,但你找不到任何谈论sql.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...