与其寻找技巧和窍门(包括延迟约束),我建议您简单地设计出摆脱这种“参考锁定”的方式——所以尝试这样的事情:
事实
(UserID)
存在。(AddressID)
是由用户创建的(UserID)
。(AddressID)
创建于Date(DateCreated)
。(AddressID)
最后被修改用户(UserID)
的日期(ModifiedOn)
。(UserID)
居住在Address。(AddressID)
(ValidFrom)
约束
Each
地址是由exactly one
用户创建的。It is possible that more than one
地址是由the same
用户创建的。
Each
地址创建于exactly one
Date。It is possible that more than one
地址创建于the same
Date。
For each
地址 and
日期,that
地址由at most one
用户在that
日期修改。
For each
用户 and
日期,that
用户自日期起居住的at most one
地址。that
逻辑的
就强制地址而言,请在应用程序层验证这一点并将加载语句包装到一个事务中——这样你将获得全部或一无所有。
您别无选择,只能在下面的 2 个操作中创建循环依赖项,因为创建第一个表时不存在一个表。
CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));
ALTER TABLE A ADD B_FK INT;
Run Code Online (Sandbox Code Playgroud)
如果你想避免循环依赖。然后您需要删除一个 REFERENCES 约束,或者您可以通过一种方式添加 DELETE 和 UPDATE CASCADE 引用。如果您的逻辑有些复杂,您也可以实现 TRIGGER。