参照完整性(Referential Integrity)是关系数据库中用于保证“外键值必须匹配被引用表中某个主键值,或为 NULL”的约束。它被破坏,本质上就是子表(引用表)里出现了父表(被引用表)中不存在的引用,或数据库因设置不当未能阻止这种不一致。
常见破坏原因可以分为以下几类:
最典型的情况:
orders(user_id) 引用用户表 users(id)DELETE FROM users WHERE id = 100;
orders 中仍有 user_id = 100 的记录如果未设置 ON DELETE 约束,或数据库未强制参照完整性,就会破坏。
例如:
UPDATE users SET id = 200 WHERE id = 100;
但子表中仍有 user_id = 100,而 200 不存在于子表引用中,导致悬空引用。
例如:
INSERT INTO orders(user_id) VALUES (999);
但 users 表中没有 id = 999,且表未加外键约束或约束被禁用。
很多破坏是“人为放行”的:
FOREIGN KEYSET FOREIGN_KEY_CHECKS = 0;
导入完成前如果数据不一致,就留下脏数据。
很多系统:
此时:
在极端情况下:
若隔离级别或锁机制不足,也可能出现瞬时不一致(通常数据库会避免,但分布式系统常见)。
都容易绕开约束。
ON DELETE CASCADE / RESTRICT / SET NULL
如果你愿意,我可以:
你想从哪方面继续?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。