温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

外键如何实现参照完整性

发布时间:2026-09-24 05:08:16 来源:亿速云 阅读:99 作者:小樊 栏目:数据库

在关系数据库中,**参照完整性(Referential Integrity)**用来保证“子表(从表)中的外键值,必须在父表(主表)的主键中存在,或者为 NULL”。
外键(Foreign Key)就是实现参照完整性的核心机制。

下面从原理 → 创建方式 → 约束行为 → 示例来说明。


一、外键实现参照完整性的原理

  1. 主表(被引用表)

    • 通常有一个主键(PRIMARY KEY)
    • 用来提供“被参照的标准值”
  2. 从表(引用表)

    • 包含一个外键列
    • 外键值必须等于主表中的某个主键值,或为空
  3. 数据库自动校验

    • 插入、更新、删除时,DBMS 会检查:
      • 从表插入/修改的外键值是否存在于主表
      • 主表删除/修改时是否影响从表数据

二、如何创建外键(以 SQL 为例)

1. 建表时定义外键

-- 主表
CREATE TABLE department (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50)
);

-- 从表
CREATE TABLE employee (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50),
    dept_id INT,
    FOREIGN KEY (dept_id)
        REFERENCES department(dept_id)
);

✅ 效果:

  • employee.dept_id 必须是 department.dept_id 中的值
  • 或为 NULL

三、外键如何保证参照完整性

1. 插入时检查(INSERT)

INSERT INTO employee VALUES (1, 'Tom', 10);
  • 若 department 中无 dept_id = 10 → ❌ 报错

2. 更新时检查(UPDATE)

UPDATE employee SET dept_id = 99 WHERE emp_id = 1;
  • 若 99 不存在 → ❌ 拒绝

3. 删除/更新主表时的行为(关键)

通过 ON DELETE / ON UPDATE 控制:

(1)RESTRICT(默认,最严格)

FOREIGN KEY (dept_id)
REFERENCES department(dept_id)
ON DELETE RESTRICT
  • 主表有从表引用时,不能删除

(2)CASCADE(级联)

ON DELETE CASCADE
  • 删除部门时,自动删除该部门所有员工

(3)SET NULL

ON DELETE SET NULL
  • 删除部门时,员工 dept_id 置为 NULL

(4)NO ACTION

  • 与 RESTRICT 类似(部分数据库有细微差别)

四、一个完整示例

CREATE TABLE department (
    dept_id INT PRIMARY KEY
);

CREATE TABLE employee (
    emp_id INT PRIMARY KEY,
    dept_id INT,
    FOREIGN KEY (dept_id)
        REFERENCES department(dept_id)
        ON DELETE CASCADE
);
操作 结果
插入员工到不存在的部门 失败
删除有员工的部门 员工一起被删
更新部门 ID 可配合 ON UPDATE CASCADE

五、总结一句话

外键通过“约束从表值必须来自主表主键,并在增删改时自动校验和联动”,来实现参照完整性。

如果你愿意,我也可以:

  • 用 MySQL / Oracle / PostgreSQL 具体语法对比
  • 讲 外键性能与反范式设计
  • 用 图示说明主从表关系
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手