当前位置:网站首页>mysql支持外键吗
mysql支持外键吗
2022-06-29 17:16:00 【亿速云】
mysql支持外键吗
本篇内容主要讲解“mysql支持外键吗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql支持外键吗”吧!
mysql支持外键。在MySQL中,外键主要用来建立主表与从表的关联关系,可以为两个表的数据建立连接,约束两个表中数据的一致性和完整性;当主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值;且外键中列的数目和对应数据类型必须和主表的主键中的相同。
本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。
mysql支持外键。
MySQL外键(FOREIGN KEY)
外键是指定表中与另一个表的另一个字段匹配的字段。外键对相关表中的数据设置了约束,这使MySQL能够保持参照完整性。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
我们来看看示例数据库中的以下数据库图。

我们有两个表:customers和orders, 每个客户都有零个或多个订单,每个订单只能属于一个客户。customers表和orders表之间的关系是一对多的,它orders由customerNumber字段指定的表中的外键建立。customers表中的customerNumber字段与orders表中的customerNumber主键字段相关 。
customers 表称为父表或引用表,orders表称为子表或引用表。
外键可以是一个列或一组列。子表中的列通常引用父表中的主键列。
表可以具有多个外键,子表中的每个外键可以引用不同的父表。
子表中的行必须包含父表中存在的值,例如,orders表中的每个订单记录必须具有customers表customerNumber中存在的值。因此,多个订单可以引用同一个客户,这种关系称为一个(客户)到多个(订单)或一对多。
有时,子表和父表是相同的。外键引用表的主键,例如,下employees表:

reportTo列是一个外键,它引用employeeNumber作为employees表的主键的列,以反映员工之间的汇报结构,即每个员工向另一个员工汇报,员工可以有零个或多个直接汇报。我们有一个关于自联接教程可以帮助您根据这种表查询数据。
reportTo外键也被称为递归或自引用的外键。
外键强制执行引用完整性,可帮助您自动维护数据的一致性和完整性。例如,您无法为不存在的客户创建订单。
此外,您可以customerNumber在外键的删除操作上设置级联,以便在删除customers表中的客户时,也会删除与客户关联的所有订单。这节省了使用多个DELETE语句 或DELETE JOIN语句的时间和精力。
与删除相同,您还可以在更新操作上为customerNumber外键定义级联,以便在不使用多个UPDATE语句或UPDATE JOIN语句的情况下执行跨表更新。
注意:在MySQL中,InnoDB 存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。
mysql定义外键时,需要遵守下列规则:
主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为主表定义主键。
主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
外键中列的数目必须和主表的主键中列的数目相同。
外键中列的数据类型必须和主表主键中对应列的数据类型相同。
为表创建外键
MySQL创建外键语法
以下语法说明如何在CREATE TABLE语句中的子表中定义外键。
CONSTRAINT constraint_nameFOREIGN KEY foreign_key_name (columns)REFERENCES parent_table(columns)ON DELETE actionON 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 table_nameADD CONSTRAINT constraint_nameFOREIGN KEY foreign_key_name(columns)REFERENCES parent_table(columns)ON DELETE actionON 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 productsADD FOREIGN KEY fk_vendor(vdr_id)REFERENCES vendors(vdr_id)ON DELETE NO ACTIONON UPDATE CASCADE;

现在,products表有两个外键,一个引用categories表,另一个引用vendors表。
到此,相信大家对“mysql支持外键吗”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
边栏推荐
- 第42期:MySQL 是否有必要多列分区
- 【现代信号处理第六次作业】
- 0基础自学STM32(野火)——寄存器点亮LED
- 最高81.98%!超百所“双一流”高校本科深造率公布
- linux中mysql 1045错误如何解决
- 从Mpx资源构建优化看splitChunks代码分割
- Why is informatization ≠ digitalization? Finally someone made it clear
- Étalonnage de la caméra monoculaire et de la caméra binoculaire à l'aide de l'outil d'étalonnage kalibr
- It is the same that robots can win gold medals without maintenance and out of bounds
- 自学结构体(小甲鱼c语言)
猜你喜欢

知道创宇为能源行业资产管理助力,入选工信部2021物联网示范项目

SLAM中的子图

High landing pressure of "authorization and consent"? Privacy computing provides a possible compliance "technical solution"

“授权同意”落地压力大?隐私计算提供一种可能的合规“技术解”

Leetcode 984. 不含 AAA 或 BBB 的字符串(网友思路)

Problem solving metauniverse, multi communication scheme in online games

深圳内推 | 深圳计算科学研究院招聘机器学习助理工程师(校招)

NAACL 2022 | 机器翻译SOTA模型的蒸馏

mysql数据库扫盲,你真的知道什么是数据库嘛

A user level thread library based on C language
随机推荐
What are the project management systems suitable for small and medium-sized enterprises?
2022 software evaluator examination outline
深度剖析monai(一) Data和Transforms部分
英联邦国家有哪些
Inheritablethreadlocal resolves message loss during message transmission between parent and child threads in the thread pool
Kali installation tutorial 2020
ICML 2022 | transferable imitation learning method based on decoupling gradient optimization
Actual combat | magical conic gradient
Which is better and safer, GF e-gold or Dongfang fortune
Simulink仿真模式
Tencent cloud released the upgraded version of CDW Clickhouse to provide a fast experience for massive data real-time analysis scenarios
正则表达式
First batch! Tencent cloud's ability to pass the solution of the government affairs collaboration platform of the China Academy of ICT
毕业季 | 华为专家亲授面试秘诀:如何拿到大厂高薪offer?
自旋电子学笔记-张曙丰
Development of freedom free agreement pledge mining system
NAACL 2022 | 机器翻译SOTA模型的蒸馏
Étalonnage de la caméra monoculaire et de la caméra binoculaire à l'aide de l'outil d'étalonnage kalibr
Kubernetes deployment dashboard (Web UI management interface)
SAAS 服务的优势都有哪些