我正在考虑设计类似于以下的数据库模式:
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 供应商几十年来一直试图解决的一种非常常见的问题。
关键是所有约束检查都必须“推迟”,直到两个插入都完成。这可以通过不同的形式来实现。数据库事务可能会提供执行类似“SET deferred constraint checking ON”之类的操作的可能性,并且你已经完成了(如果不是因为在这个特定示例中,你可能不得不非常努力地设计你的设计才能能够只定义两个 FK 约束,因为其中一个在 SQL 意义上根本不是“真正的”FK!)。
此处描述的基于触发器的解决方案基本上可以达到相同的效果,但它们会面临应用程序强制完整性存在的所有维护问题。
在他们的工作中,Chris Date 和 Hugh Darwen 描述了问题的真正解决方案:多重分配。也就是说,从本质上讲,可以组合多个不同的更新语句并让 DBMS 对其进行操作,就好像那是一个单独的语句一样。该概念的实现确实存在,但您找不到任何与 SQL 相关的实现。
关于sql-server - 双向外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1607916/