延迟约束检查
两个属性互为外键时插入会遇到什么问题?
- 场景: 关系 A 的属性引用关系 B, 关系 B 的属性又引用关系 A;
- 困难: 无论先插哪一侧, 另一侧都还不存在目标元组, 正常的添加外键无法执行;
- 绕过: 先把外键值置为 NULL, 再把新元组插入被引用关系, 最后回填外键值;
DEFERRABLE 怎样推迟约束检查?
- 手段: 在约束声明后加
DEFERRABLE; - 行为: 完整性约束不在每条语句后立即检查, 而是等事务完成后才检查;
- 效果: 互为外键的插入可以在同一事务内分步完成;
CREATE TABLE Studio(
name CHAR(30) PRIMARY KEY,
address VARCHAR(255),
presC INT REFERENCES MovieExec(cert)
ON DELETE SET NULL
ON UPDATE CASCADE
DEFERRABLE
);
(source: 060-约束和触发器.md §键和外键/§延迟约束检查)