mysql有哪些外键约束等级

来源:网站建设作者:木下头衔:网络博主
导读:本期聚焦于小伙伴创作的《mysql有哪些外键约束等级》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《mysql有哪些外键约束等级》有用,将其分享出去将是对创作者最好的鼓励。

mysql的外键约束用于维护两个表之间的关联关系,当对主表的主键或唯一键进行更新、删除操作时,从表的外键字段会根据设置的约束等级执行对应的处理逻辑,以此保证关联数据的完整性和一致性。

mysql有哪些外键约束等级

mysql支持的5种外键约束等级

mysql的外键约束等级分为针对删除操作和更新操作的两类规则,组合起来共5种常用的约束等级,具体如下:

约束等级名称删除主表记录时的行为更新主表关联键时的行为
CASCADE自动删除从表中关联的记录自动更新从表中关联的外键值
SET NULL将从表关联记录的外键值设为NULL将从表关联记录的外键值设为NULL
RESTRICT拒绝删除主表记录,返回错误拒绝更新主表关联键,返回错误
NO ACTION等价于RESTRICT,拒绝操作返回错误等价于RESTRICT,拒绝操作返回错误
SET DEFAULT将从表外键值设为预设的默认值将从表外键值设为预设的默认值

各约束等级详细说明

1. CASCADE(级联操作)

当主表的关联记录被删除或更新时,从表中所有关联的外键记录会同步执行删除或更新操作。这种方式适合主从表数据强关联的场景,比如订单表和订单明细表,删除订单时同步删除对应的明细记录。

创建外键时设置CASCADE的示例:

-- 创建主表 用户表
CREATE TABLE user (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

-- 创建从表 订单表,外键关联用户表的id,设置删除和更新都为CASCADE
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  user_id INT,
  order_amount DECIMAL(10,2),
  CONSTRAINT fk_user_orders FOREIGN KEY (user_id) 
  REFERENCES user(id) 
  ON DELETE CASCADE 
  ON UPDATE CASCADE
);

2. SET NULL(设为空值)

当主表的关联记录被删除或更新时,从表中对应记录的外键字段会被设置为NULL。使用该等级需要保证从表的外键字段允许为NULL,适合主表记录删除后从表记录仍需保留的场景,比如员工表和部门表,删除部门后将员工的部门id设为NULL。

设置SET NULL的示例:

-- 创建部门表
CREATE TABLE department (
  dept_id INT PRIMARY KEY,
  dept_name VARCHAR(50)
);

-- 创建员工表,外键关联部门表,删除和更新都设为SET NULL
CREATE TABLE employee (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR(50),
  dept_id INT,
  CONSTRAINT fk_dept_emp FOREIGN KEY (dept_id) 
  REFERENCES department(dept_id) 
  ON DELETE SET NULL 
  ON UPDATE SET NULL
);

3. RESTRICT(限制操作)

当从表中存在关联的主表记录时,拒绝执行主表的删除或更新操作,直接返回错误。这是mysql外键的默认约束等级,适合不允许主表关联数据变动的场景,避免误操作导致从表数据失去关联。

设置RESTRICT的示例:

-- 创建分类表
CREATE TABLE category (
  cate_id INT PRIMARY KEY,
  cate_name VARCHAR(50)
);

-- 创建商品表,外键关联分类表,使用RESTRICT约束
CREATE TABLE goods (
  goods_id INT PRIMARY KEY,
  goods_name VARCHAR(100),
  cate_id INT,
  CONSTRAINT fk_cate_goods FOREIGN KEY (cate_id) 
  REFERENCES category(cate_id) 
  ON DELETE RESTRICT 
  ON UPDATE RESTRICT
);

4. NO ACTION(无操作)

NO ACTION的行为和RESTRICT完全一致,在mysql中两者是等价的,当从表存在关联记录时,主表的删除和更新操作会被拒绝。部分数据库标准中NO ACTION和RESTRICT存在差异,但mysql中两者没有区别。

5. SET DEFAULT(设为默认值)

当主表的关联记录被删除或更新时,从表的外键字段会被设置为预设的默认值。不过mysql的InnoDB引擎目前不支持SET DEFAULT等级,该等级更多在其他数据库中使用,设置时需要确认存储引擎是否支持。

约束等级的选择建议

实际开发中可以根据业务场景选择对应的约束等级:

  • 如果主从表数据必须同步删除更新,优先选择CASCADE
  • 如果主表记录删除后从表记录需要保留,且外键允许为空,选择SET NULL
  • 如果不允许主表关联数据随意变动,选择默认的RESTRICT即可
  • 避免使用SET DEFAULT,因为mysql的InnoDB引擎不支持该等级

另外需要注意,mysql中只有InnoDB引擎支持外键约束,MyISAM引擎不支持外键,创建表时需要确认存储引擎类型。同时外键字段的类型需要和主表关联字段的类型完全一致,否则无法创建外键约束。

mysql外键约束foreign_key数据库约束修改时间:2026-06-18 22:21:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。