作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL(本章节)
PostgreSQL
Redis
Etcd
我们来深入探讨 MySQL 中的外键(Foreign Key)。外键是关系型数据库的基石,用于强制保持数据之间的参照完整性(Referential Integrity)。
外键是表中的一个或多个字段,其值必须与另一张表(或本表)的主键(Primary Key) 或唯一键(Unique Key) 的值相匹配。
它建立了两张表之间的一种“从属”或“关联”关系。
简单比喻:
department
表(主表)有 id
(主键) 和 name
字段。employee
表(从表)有 id
, name
, 和 dept_id
字段。dept_id
就是一个外键,它引用了 department
表的 id
字段。它保证了每个员工所属的部门一定是在 department
表中真实存在的。外键的核心目的不是为了提高查询性能(事实上,它有时会降低性能),而是为了强制维护数据之间的逻辑关系,防止“孤立数据”和“无效数据”的出现。
没有外键约束时,可能会发生:
employee
表中插入一个 dept_id = 999
的员工,但 department
表中根本不存在 id = 999
的部门。这个员工就成了“孤儿数据”。department
表中删除一个正在被 employee
表引用的部门,导致大量员工指向一个不存在的部门。外键约束可以自动防止上述情况发生。
当你定义外键时,可以指定当主表中的数据被更新(UPDATE)或删除(DELETE)时,对从表中的数据应该执行什么操作。这是外键最强大的功能所在。
以下是主要的引用操作:
RESTRICT
/ NO ACTION
(默认行为)CASCADE
(级联操作)ON DELETE CASCADE
:删除主表中的记录时,自动删除从表中所有相关联的记录。ON UPDATE CASCADE
:更新主表主键的值时,自动更新从表中所有相关外键的值。ON DELETE CASCADE
设定后,删除一个部门,该部门下的所有员工记录也会被自动删除。此操作非常危险,需谨慎使用!SET NULL
NULL
。NULL
。dept_id
字段自动设为 NULL
,表示这些员工暂时“未分配部门”。SET DEFAULT
CREATE TABLE departments (
department_id INT PRIMARY KEY AUTO_INCREMENT,
department_name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
department_id INT,
-- 定义外键约束
FOREIGN KEY (department_id)
REFERENCES departments(department_id)
ON DELETE SET NULL
ON UPDATE CASCADE
);
外键语法:
FOREIGN KEY (department_id)
:指定当前表中的哪个字段是外键REFERENCES departments(department_id)
:指定外键引用哪个表的哪个字段ON DELETE SET NULL
:当被引用的部门被删除时,将此字段设为 NULLON UPDATE CASCADE
:当被引用的部门ID更新时,自动更新所有相关的员工记录