双向外键约束

jth*_*thg 6 database sql-server foreign-keys

我正在考虑设计类似于以下的数据库模式:

Person (
  PersonID int primary key,
  PrimaryAddressID int not null,
  ...
)

Address (
  AddressID int primary key,
  PersonID int not null,
  ...
)
Run Code Online (Sandbox Code Playgroud)

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

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

Erw*_*out 11

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

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

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

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

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

在他们的工作中,Chris Date和Hugh Darwen描述了什么是这个问题的真正解决方案:多重任务.也就是说,基本上,可以组成几个不同的更新语句并让DBMS对其进行操作,就好像这是一个单一的语句.这个概念的实现确实存在,但是你找不到任何谈论SQL的东西.