mysql中的外键约束_MySQL外键约束

article/2025/4/30 11:35:59

在本教程中,您将了解MySQL外键(foreign key)以及如何在MySQL中创建,添加和删除外键约束。

MySQL外键简介

外键表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持参照完整性。

下面来看看示例数据库(yiibaidb)中的以下数据库中两个表:customers和`orders``的ER图。

上图中有两张表:customers和orders。每个客户有零个或多个订单,每个订单只属于一个客户。customers表和orders表之间的关系是一对多的,它是由customerNumber字段指定在orders表中建立外键(引用customers表的customerNumber字段)。orders表中的customerNumber字段与customers表中的customerNumber主键字段相关。

customers表称为父表或引用表,orders表称为子表或引用表。

表可以有多个外键,子表中的每个外键可能引用不同的父表。

子表中的行必须包含父表中存在的值,例如,orders表中的每个订单记录必须在customers表中存在customerNumber。 因此,多个订单可以指同一个客户,因此这种关系称为一个(客户)到许多(订单)或一对多。

有时,子表和父表是一样的。外键返回到表的主键,例如以下employees表:

91e5b16e05656206947e3bc71afeb6d0.png

reportTo列是一个引用employeeNumber列的外键,employeeNumber列是employees表的主键,以反映员工之间的报告结构,即每个员工向另一个员工发送的报告和员工可以有零个或多个直接报告。有关如何使用有,请参考自连接教程,以帮助您根据这种表查询来查询相关数据。

reportTo外键也称为递归或自引用外键。

外键执行引用完整性,可以帮助您自动维护数据的一致性和完整性。 例如,不能为不存在的客户创建订单。

此外,可以为customerNumber外键设置级联删除操作,以便在customers表中删除客户时,与客户关联的所有订单也将被删除。 这样可以节省您使用多个DELETE语句或DELETE JOIN语句的时间和精力。

与删除相同,还可以为customerNumber外键定义级联更新操作,以执行交叉表更新,而不使用多个UPDATE语句或UPDATE JOIN语句。

在MySQL中,InnoDB存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。

创建外键

MySQL创建外键语法

以下语法说明了如何在CREATE TABLE语句中的子表中定义外键。

CONSTRAINT constraint_name

FOREIGN KEY foreign_key_name (columns)

REFERENCES parent_table(columns)

ON DELETE action

ON UPDATE action

下面我们来更详细的查看上面语法:

CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。

FOREIGN KEY子句指定子表中引用父表中主键列的列。您可以在FOREIGN KEY子句后放置一个外键名称,或者让MySQL为您创建一个名称。 请注意,MySQL会自动创建一个具有foreign_key_name名称的索引。

REFERENCES子句指定父表及其子表中列的引用。 在FOREIGN KEY和REFERENCES中指定的子表和父表中的列数必须相同。

ON DELETE子句允许定义当父表中的记录被删除时,子表的记录怎样执行操作。如果省略ON DELETE子句并删除父表中的记录,则MySQL将拒绝删除子表中相关联的数据。此外,MySQL还提供了一些操作,以便您可以使用其他选项,例如ON DELETE CASCADE,当删除父表中的记录时,MySQL可以删除子表中引用父表中记录的记录。 如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。当父表中的记录被删除时,MySQL会将子表中的外键列值设置为NULL,条件是子表中的外键列必须接受NULL值。 请注意,如果使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL将拒绝删除。

ON UPDATE子句允许指定在父表中的行更新时,子表中的行会怎样执行操作。当父表中的行被更新时,可以省略ON UPDATE子句让MySQL拒绝对子表中的行的任何更新。 ON UPDATE CASCADE操作允许您执行交叉表更新,并且当更新父表中的行时,ON UPDATE SET NULL操作会将子表中行中的值重置为NULL值。 ON UPDATE NO ACTION或UPDATE RESTRICT操作拒绝任何更新。

MySQL创建表外键示例

以下示例创建一个dbdemo数据库和两个表:categories和products。每个类别都有一个或多个产品,每个产品只属于一个类别。 products表中的cat_id字段被定义为具有UPDATE ON CASCADE和DELETE ON RESTRICT操作的外键。

CREATE DATABASE IF NOT EXISTS dbdemo;

USE dbdemo;

CREATE TABLE categories(

cat_id int not null auto_increment primary key,

cat_name varchar(255) not null,

cat_description text

) ENGINE=InnoDB;

CREATE TABLE products(

prd_id int not null auto_increment primary key,

prd_name varchar(355) not null,

prd_price decimal,

cat_id int not null,

FOREIGN KEY fk_cat(cat_id)

REFERENCES categories(cat_id)

ON UPDATE CASCADE

ON DELETE RESTRICT

)ENGINE=InnoDB;

添加外键

MySQL添加外键语法

要将外键添加到现有表中,请使用ALTER TABLE语句与上述外键定义语法:

ALTER table_name

ADD CONSTRAINT constraint_name

FOREIGN KEY foreign_key_name(columns)

REFERENCES parent_table(columns)

ON DELETE action

ON UPDATE action;

MySQL添加外键示例

现在,我们添加一个名为vendors的新表,并更改products表以包含供应商ID字段:

USE dbdemo;

CREATE TABLE vendors(

vdr_id int not null auto_increment primary key,

vdr_name varchar(255)

)ENGINE=InnoDB;

ALTER TABLE products

ADD COLUMN vdr_id int not null AFTER cat_id;

要在products表中添加外键,请使用以下语句:

ALTER TABLE products

ADD FOREIGN KEY fk_vendor(vdr_id)

REFERENCES vendors(vdr_id)

ON DELETE NO ACTION

ON UPDATE CASCADE;

现在,products表有两个外键,一个是引用categories表,另一个是引用vendors表。

删除MySQL外键

您还可以使用ALTER TABLE语句将外键删除,如下语句:

ALTER TABLE table_name

DROP FOREIGN KEY constraint_name;

在上面的声明中:

首先,指定要从中删除外键的表名称。

其次,将约束名称放在DROP FOREIGN KEY子句之后。

请注意,constraint_name是在创建或添加外键到表时指定的约束的名称。 如果省略它,MySQL会为您生成约束名称。

要获取生成的表的约束名称,请使用SHOW CREATE TABLE语句,如下所示:

SHOW CREATE TABLE table_name;

例如,要查看products表的外键,请使用以下语句:

SHOW CREATE TABLE products;

以下是语句的输出:

CREATE TABLE products (

prd_id int(11) NOT NULL AUTO_INCREMENT,

prd_name varchar(355) NOT NULL,

prd_price decimal(10,0) DEFAULT NULL,

cat_id int(11) NOT NULL,

vdr_id int(11) NOT NULL,

PRIMARY KEY (prd_id),

KEY fk_cat (cat_id),

KEY fk_vendor(vdr_id),

CONSTRAINT products_ibfk_2

FOREIGN KEY (vdr_id)

REFERENCES vendors (vdr_id)

ON DELETE NO ACTION

ON UPDATE CASCADE,

CONSTRAINT products_ibfk_1

FOREIGN KEY (cat_id)

REFERENCES categories (cat_id)

ON UPDATE CASCADE

) ENGINE=InnoDB;

products表有两个外键约束:products_ibfk_1和products_ibfk_2。

可以使用以下语句删除products表的外键:

ALTER TABLE products

DROP FOREIGN KEY products_ibfk_1;

ALTER TABLE products

DROP FOREIGN KEY products_ibfk_2;

MySQL禁用外键检查

有时,因为某种原因需要禁用外键检查(例如将CSV文件中的数据导入表中)非常有用。 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据。

除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。

要禁用外键检查,请使用以下语句:

SET foreign_key_checks = 0;

当然,可以使用以下语句启用它:

SET foreign_key_checks = 1;

在本教程中,我们已经介绍了很多有关MySQL外键的内容。还向您介绍了一些非常方便的语句,允许您在MySQL中有效地管理外键。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。


http://chatgpt.dhexx.cn/article/wDDeQCSZ.shtml

相关文章

MySQL——外键约束

设置外键约束(FOREIGN KEY, FK ) MySQL外键约束是表的一个特殊字段,经常与外键约束一起使用。对于两个具有关联关系的表而言,相关字段中主键所在表称为主表(父表),外键所在表称为从表(子表)。 …

mysql数据库 外键约束

外部关键字 在以后我们统一将外部关键字叫做外键,外键就是另一张表中的主键。 问:外键有啥用啊?答:外键的主要作用就是保持数据的一致性,完整性。 再问:怎么保证的呢?答:看图。 如…

为啥禁用外键约束

【阿里JAVA规范】 :不得使用外键与级联,一切外键概念必须在应用层解决 阿里巴巴为什么这么规定? 1.每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便,也就是说插入一条主记录的…

Mysql外键约束怎么删除

记录一下碰到的问题。由于我是使用PowerDesigner来建mysql物理模型的,为了表与表之间的关系更加清楚,我给他们连线了。之后我就用它生成的SQL语句在navicat把表建出来,我看见没问题就直接用了,毕竟初学者嘛,嘿嘿。 到我…

mysql怎么写主外键_mysql主外键约束怎么写?

mysql主键约束的写法:“CREATE TABLE 表名(字段名 数据类型 PRIMARY KEY)”;mysql外键约束的写法:“CREATE TABLE 表名(FOREIGN KEY 字段名 REFERENCES 主表名 主键列)”。 mysql主键约束 主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情…

mysql外键约束怎么写_mysql外键约束怎么写

mysql外键约束的写法:【[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1】。外键约束是表的一个特殊字段,经常与主键约束一起使用。 在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键。 (推荐学习:mysql教程) 具体的语法格式如下:[CONSTRAINT ] FOREIGN K…

选型必看:RabbitMQ 七战 Kafka,差异立现

点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Sometimes you just have to pick yourself up and carry on. 有时候,你只能自己振作起来,继续努力下去。 每日掏心话 夜晚想要矫情的时候&#…

小程序上传发布版本配置以及登录报错

钉钉小程序编写完之后需要上传先附上操作地址https://oa.dingtalk.com/?redirecthttp%3A%2F%2Foa.dingtalk.com%2Fomp%2Fapi%2Fmicro_app%2Fadmin%2Flanding%3Fcorpid%3Dopen-dev.dingtalk.com%26redirect_url%3Dhttp%3A%2F%2Fopen-dev.dingtalk.com%2F#/login。 首先需要确认…

2021-08-25

omp版本swan linux netcdf export CCgcc export CXXg export FCgfortran export F77gfortran export F90gfortran perl switch.pl -unix -pun -netcdf make config nf –config --all 查看netcdf fortran库安装位置 Fflags 写在FLAGS_SER后面 Flibs 写在else Libs_ser后面 –…

【小技巧】如何安装下载MATLAB最新的工具箱

小伙伴们,在使用matlab的时候,经常会遇到某些函数无法找到而导致程序报错,通常情况,一般是由于该函数是MATLAB一些工具箱中的函数,而原始版本的MATLAB是没有这个工具箱的,所以导致报错。那么如何查看当前版…

数字化时代,如何做好用户体验与应用性能管理

引言 随着数字化时代的到来,各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务,这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责,且使用多种运维工具,因此,当…

omp的一个不错的文章

实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有多个核心和一个内存&a…

matlab 支撑集,基于OMP算法的快速压缩感知图像重构

引用本文 马博珩, 彭艺. 基于OMP算法的快速压缩感知图像重构[J].云南大学学报(自然科学版), 2017,39(2): 207-211. MA Bo-heng, PENG Yi. Fast compressed sensing image reconstruction based on OMP algorithm[J]. Journal of Yunnan University(Natural Sciences), 2017,39(…

使用omp并行技术实现快排加速

快排基本原理: 快速排序可以说是最为常见的排序算法,冒泡排序时间复杂度达到了O(N2),而桶排序容易造成浪费空间。快排(Quicksort)就成为了不错的选择。 1、原理:快排需要找一个数作…

粒子群算法Fortran代码(OMP并行)

粒子群算法可用于解决强非线性优化问题,原理较为简单(参加:最优化算法之粒子群算法(PSO)_青萍之末的博客-CSDN博客_粒子群算法),这里给出Fortran代码实现模块( module POS)。该代码适用于任意参数个数的情况&#xff0…

基于C语言实现并行程序设计

资源下载地址:https://download.csdn.net/download/sheziqiong/86771681 资源下载地址:https://download.csdn.net/download/sheziqiong/86771681 lab1 分别用omp和mpi实现树型求和和蝶式求和 树型omp实现思路:对每一层的计算并行化&#xf…

0成本睡后收入!从0教你搭建外卖红包CPS小程序

外卖返利小程序源码; 轻松部署搭建,小程序服务号数据互通; 对接美团官方; 佣金比例自定义分配; 三级分佣,所有资金数据一目了然; 拉新立减最低4.9元购月卡; 签到20天免费领取会员卡; 提现秒到账&#xff01…

SLAM前端之ndt_omp使用

ndt_omp(部分参考https://zhuanlan.zhihu.com/p/48853182) 简介: koide3/ndt_omp。继承自pcl ndt,并做了多线程等优化。参考:koide3/ndt_omp 环境需求: 1) 需要编译安装pcl-1.8.1或以上版本。因为ndt_omp是继承自pcl ndt的。 …

正交匹配追踪算法OMP

浅谈压缩感知&#xff08;九&#xff09;&#xff1a;正交匹配追踪算法OMP </h1><div class"clear"></div><div class"postBody">主要内容&#xff1a; OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一、OMP算法介绍 来源&#…

OMP算法代码学习

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; https://blog.csdn.net/jbb0523/article/details/45130793 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/…