微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

原文地址:https://www.jb51.cc/mssql/83227.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐