在数据库“更新(UPDATE)”操作中,**参照完整性(Referential Integrity)**用于保证“子表(引用表)中的外键值”必须对应“父表(被引用表)中存在的键值”,从而防止出现“引用了不存在的数据”的情况。
下面按常见场景说明它是如何作用的。
假设有两个表:
departments(dept_id PK, dept_name)employees(emp_id PK, dept_id FK → departments.dept_id)参照完整性要求:
employees.dept_id 的值,必须是 departments.dept_id 中已存在的值NULL(如果外键允许空)UPDATE departments
SET dept_id = 20
WHERE dept_id = 10;
此时数据库会检查:
employees.dept_id = 10 的记录?ON UPDATE CASCADE → 子表 dept_id = 10 自动改为 20UPDATE departments
SET dept_name = 'IT'
WHERE dept_id = 10;
✅ 通常不影响参照完整性,因为外键未变。
UPDATE employees
SET dept_id = 30
WHERE emp_id = 1;
数据库检查:
departments 中是否存在 dept_id = 30?UPDATE employees
SET dept_id = NULL
WHERE emp_id = 1;
✅ 若外键允许 NULL,则允许(表示“暂无部门”)
| 策略 | 父表更新时行为 |
|---|---|
NO ACTION / RESTRICT |
阻止更新(默认) |
CASCADE |
子表同步更新 |
SET NULL |
子表外键置空 |
SET DEFAULT |
子表外键设为默认值 |
示例:
FOREIGN KEY (dept_id)
REFERENCES departments(dept_id)
ON UPDATE CASCADE
更新时,参照完整性会确保“改父表不破坏子表引用,改子表不指向不存在的父表记录”。
如果你愿意,我也可以用 MySQL / Oracle / PostgreSQL 的具体例子或画图说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。