外键约束RESTRICT和NO ACTION有何不同?MySQL外键详解

 更新时间:2026年07月25日 10:43:17   作者:遇星  
还在为MySQL外键约束的创建和规则头疼吗?本文手把手教你建立外键约束的语法,详解CASCADE、SET NULL、RESTRICT等删除更新规则,并总结外键约束的常见注意事项,助你避免数据不一致的坑,轻松管理数据库关系

一、建立外键约束

语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY
 [index_name] (col_name, ...)
 REFERENCES tbl_name (col_name,...)
 [ON DELETE reference_option]
 [ON UPDATE reference_option]
reference_option:
 RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

1. CONSTRAINT [symbol]]指定约束名字,不写则系统自动生成外键约束名;

2. MySQL强制外键约束的列上必须要有索引, [index_name]指定索引名,不写则系统自动生成索引名,如果已经存在可以用于支持外键约束的索引,那么指定的索引名则无效,采用已有的索引;

3. [ON DELETE reference_option][ON UPDATE reference_option]指定主表update和delete操作时,子表对应的数据怎么响应;

建立外键约束例子如:

create table tab1 (id int primary key);
create table tab2 (
id int primary key,
col1 int,
foreign key (col1)
references tab1(id)
);

下面看一下[ON DELETE reference_option][ON UPDATE reference_option]reference_option都有哪些参数:

1.CASCADE,级联删除/级联更新,即主表delete或update了被其他表引用的数据,对应子表的数据也被delte或update;

2.SET NULL,当主表delete或update了被其他表引用的数据,对应子表的数据被设为null,注意子表的外键不能设为not null;

3.RESTRICT,主表不允许delete或update被其他表引用的数据;当没有指定任何[ON DELETE reference_option][ON UPDATE reference_option],默认是采用RESTRICT;

4.NO ACTION,在MySQL中,等效于RESTRICT;

5.SET DEFAULT,InnoDB和NDB中无法使用该参数。

二、添加外键约束

语法如下:

ALTER TABLE tbl_name
 ADD [CONSTRAINT [symbol]] FOREIGN KEY
 [index_name] (col_name, ...)
 REFERENCES tbl_name (col_name,...)
 [ON DELETE reference_option]
 [ON UPDATE reference_option]

基本的语法参数在上文已经解释了。

三、删除外键约束

语法如下:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

fk_symbol即外键约束名,如果不知道具体是什么,可以使用show create table tab_name\G来查看。

四、外键约束注意事项

1.外键上无法插入主表没有的数据,也无法更新为主表没有的数据;

2.外键上必须要有索引,主表上对应的列最好也创建索引,因为当子表外键插入数据时,也是需要到主表对应的列上去检查数据是否存在,有索引可以提高效率;

3.如果一个表被其他表的外键引用,则这个表无法被删除;如果通过set foreign_key_checks=0强制删除主表,则子表无法插入任何数据;

4.外键的字段类型,字符集必须要跟引用的字段一致,unsigned属性也要一致,否则无法创建外键约束;

5.被引用的列上必须要有索引,否则无法创建外键约束。

五、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL常用表级操作总结

    MySQL常用表级操作总结

    这篇文章主要为大家详细介绍了MySQL中常用的表级操作,文中的示例代码简洁易懂,对我们学习MySQL有一定的帮助,感兴趣的小伙伴可以学习一下
    2023-08-08
  • Mysql中常用的几种join连接方式总结

    Mysql中常用的几种join连接方式总结

    join语句是面试中经常会让你现场写出来的语句,下面这篇文章主要给大家介绍了关于Mysql中常用的几种join连接方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • MySQL中DISTINCT语句去重优化机制详解

    MySQL中DISTINCT语句去重优化机制详解

    本文深入解析了SQL中DISTINCT的优化机制,介绍了内SQL内内核如何自动将DISTINCT改写为GROUPBY或LIMIT以提高查询效率,通过具体案例展示了优化器如何通过语义推理确定目标列是否被常量固定,从而实现高效去重
    2026-06-06
  • Mysql 5.5.56版本(二进制包安装)自定义安装路径步骤记录

    Mysql 5.5.56版本(二进制包安装)自定义安装路径步骤记录

    这篇文章主要介绍了Mysql 5.5.56版本(二进制包安装)自定义安装路径步骤记录,需要的朋友可以参考下
    2017-07-07
  • MySQL实现批量插入测试数据的方式小结

    MySQL实现批量插入测试数据的方式小结

    在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 经常需要一些测试数据, 本文主要介绍了两种常用的MySQL测试数据批量生成方式,希望对大家有所帮助
    2023-11-11
  • MYSQL 性能分析器 EXPLAIN 用法实例分析

    MYSQL 性能分析器 EXPLAIN 用法实例分析

    这篇文章主要介绍了MYSQL 性能分析器 EXPLAIN 用法,结合实例形式分析了MYSQL 性能分析器 EXPLAIN 基本功能、使用方法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • MySQL定期分析检查与优化表的方法小结

    MySQL定期分析检查与优化表的方法小结

    听DBA的人说,相比oracle,MySQL就是一个玩具级别的数据库,在网易门户中,DBA基本很少去管理到MySQL的东西,所以我们产品使用到的MySQL的一些配置和优化还是需要我们开发人员自己动手,下面就简单介绍一下实用的定期优化方法
    2014-06-06
  • mysql中redo log和 binlog的区别

    mysql中redo log和 binlog的区别

    本文主要介绍了mysql中redo log和 binlog的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • MySQL5.7 JSON类型使用详解

    MySQL5.7 JSON类型使用详解

    MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。 我们先看看MySQL老版本的JSON存取方式,具体内容详情大家参考下本文吧
    2017-10-10
  • mysql滑动订单问题原理与解决方法实例分析

    mysql滑动订单问题原理与解决方法实例分析

    这篇文章主要介绍了mysql滑动订单问题原理与解决方法,结合实例形式分析了mysql滑动订单的问题的基本原理、解决方法与相关操作注意事项,需要的朋友可以参考下
    2019-12-12

最新评论