foreignkey  是指一对多关系时建立的关系:

外键是表中与另一个表的另一个字段匹配的字段。外键对相关表中的数据施加限制,这使MySQL能够保持参照完整性。  

操作:

  

能看懂图吗?

下面直接看代码:

  

我们有两个表:customersorders. 每个客户都有零个或多个订单,每个订单只能属于一个客户。customers表和orders表之间的关系是一对多关系,并且orders由该customerNumber字段指定的表中的外键建立。表中的customerNumber字段与orders表中的customerNumber主键字段相关  customers

customers 表称为父表或被引用表,该orders表称为子表引用表

外键可以是一列或一组列。子表中的列通常引用父表中的主键列。

一个表可能有多个外键,并且子表中的每个外键都可能引用不同的父表。

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

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

reportTo列是一个外键,它指的employeeNumberemployees表格的主键,以反映员工之间的报告结构,即每个员工向另一个员工报告,员工可以有零个或多个直接报告。我们有一个关于自联接的特定教程,可以帮助您根据这种表格查询数据。

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

外键实施参照完整性,可帮助您自动维护数据的一致性和完整性。例如,您无法为不存在的客户创建订单。

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

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

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

添加外键代码:

  

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

View Code

  • CONSTRAINT子句允许您为外键约束定义约束名称。如果你忽略它,MySQL会自动生成一个名字。
  • FOREIGN KEY子句指定子表中引用父表中主键列的列。你可以在FOREIGN KEY子句之后放置一个外键名,或者让它为MySQL创建一个名字。注意MySQL会自动创建一个带有foreign_key_name名字的索引。
  • REFERENCES子句指定父表和它的子表中的列引用的列。在规定的子表和父表的列数FOREIGN KEYREFERENCES必须相同。
  • ON DELETE子句允许您定义删除父表中的记录时,子表中记录发生的情况。如果您省略了ON DELETE子句并删除了在子表中具有记录的父表中的记录,那么MySQL将拒绝删除。此外,MySQL还为您提供了一些操作,以便您可以使用其他选项,例如ON DELETE CASCADE  ,要求MySQL删除子表中引用父表中的记录时父表中的记录被删除的记录。如果您不希望删除子表中的相关记录,则可以使用该ON DELETE SET NULL操作。MySQL会将子表中的外键列值设置为NULL当父表中的记录被删除时,使用子表中的外键列必须接受NULL值的条件。请注意,如果您使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL将拒绝删除。
  • ON UPDATE子句允许您指定更新父表中的行时发生的子表中的行。ON UPDATE当父表中的行更新时,可以省略该子句以使MySQL拒绝对子表中的行进行任何更新。该ON UPDATE CASCADE操作允许您执行交叉表更新,当父表ON UPDATE SET NULL中的行更新时,该操作会将子表中的行中的值重置为值NULL。该ON UPDATE NO ACTIONUPDATE RESTRICT行动拒绝任何更新。

MySQL创建表外键示例

下面的示例创建一个dbdemo数据库和两个表:categories和  products.每个类别具有一个或多个产品和每个产品只属于一个类别。表中的cat_id字段products被定义为带有UPDATE ON CASCADEDELETE 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 CASCADEON DELETE RESTRICT
)ENGINE=InnoDB;

View Code

将外键添加到表中

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;

View Code

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;

View Code

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

2
3
4
5
ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

View Code

现在,该products表有两个外键,一个categories表指向表,另一个指向vendors表。

删除MySQL外键

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

ALTER TABLE table_name
DROP FOREIGN KEY constraint_name;

View Code

在上面的声明中:

  • 首先,指定要从中删除外键的表名。
  • 其次,您将约束名称放在该DROP FOREIGN KEY子句之后。

注意,这constraint_name是在创建或向表中添加外键时指定的约束的名称。如果你忽略它,MySQL会为你生成一个约束名称。

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

SHOW CREATE TABLE table_name;

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

SHOWS  CREATE TABLE products;

On Delete和On Update都有Restrict,No Action, Cascade,Set Null属性。现在分别对他们的属性含义做个解释。

  • ON DELETE

restrict(约束):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。

no action:意思同restrict.即如果存在从数据,不允许删除主数据。

cascade(级联):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。

set null:当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)

  • ON UPDATE

restrict(约束):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。

no action:意思同restrict.

cascade(级联):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。

set null:当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

注:NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。

转载于:https://www.cnblogs.com/xz2ll/p/9252168.html

Mysql foreignkey 相关相关推荐

  1. Mysql数据库(四)——mysql索引相关知识

    Mysql数据库(四)--mysql索引相关知识 一.索引的概念 二.索引的优缺点 1.优点 2.缺点 三.创建索引的原则 四.索引的分类和创建方法 1.普通索引 ①.直接创建索引 ②.修改表方式创建 ...

  2. mysql子查询sysdate_Oracle向MySQL 迁移相关事项

    Oracle向MySQL 迁移相关事项 从Oracle移植到MySQL主要有六个方面的内容需要移植,一是表Table,包括表结构和数据,二是触发器Trigger,三是存储过程Procedure,函数f ...

  3. mysql内部时区_一文解决MySQL时区相关问题

    前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...

  4. mysql权限相关操作

    默认帐号存储位置 位于mysql数据库中 位于user表 创建mysql帐号 需要登陆mysql 使用超级管理员登陆 只有超级管理员才有权限添加帐号 C:\Users\Administrator> ...

  5. mysql数据库相关

    本文记录下mysql数据相关的核心知识点,主要包括索引,事务,锁,并发控制和sql优化等.后续会持续更新. 文章目录 锁和并发控制 索引相关 事务相关 sql相关 其他部分 面试题 锁和并发控制 记录 ...

  6. 零基础带你学习MySQL—字符串相关的函数(十三)

    零基础带你学习MySQL-字符串相关的函数(十三) 一.CHARSET (str)返回子串字符集 二.CONCAT连接子串,将多个列拼接成一列 三.INSTR(string,substring)返回s ...

  7. mysql数据库相关操作

    1.进入mysql/bin目录下输入mysqladmin processlist; 2.启动mysql,输入show processlist; 如果有 SUPER 权限,则可以看到全部的线程,否则,只 ...

  8. MySQL索引相关知识整理学习

    MySQL索引相关知识整理学习 前言 一.MySQL索引 哈希索引 B+树索引 B+树的优点 聚簇索引 非聚簇索引 聚簇索引和非聚簇索引的特点及区别: 二.特殊类型的索引 1.覆盖索引 2.联合索引 ...

  9. Ubuntu中完全卸载MySQL所有相关文件

    首先输入如下命令: dpkg --list|grep mysql 可以查看自己的mysql有哪些依赖: 先执行如下命令: sudo apt-get remove mysql-common sudo a ...

最新文章

  1. 解决SecureCRT中文乱码
  2. 基于 Dash Bio 的生物信息学数据可视化
  3. static 与 extern 关键字描述说明
  4. 《精通并发与Netty》学习笔记(02 - 服务端程序编写)
  5. cnocr:用来做中文OCR的Python3包,装上就能用!
  6. idea生成类注释和方法注释的方法
  7. *第十五周*数据结构实践项目三【B-树的基本操作】
  8. DICOM中的入门概念
  9. navicat安装+链接mysql 8.x
  10. 图像处理中的几种预处理方式
  11. 回流reflow与重绘repaint
  12. Jointly Extracting Multiple Triplets with Multilayer Translation Constraints [论文研读]
  13. LeetCode 热题 HOT 100 -------160. 相交链表(链表)206. 反转链表(递归、回溯)
  14. JVM_12 垃圾回收3-垃圾回收器
  15. 参会指南 · 2018中国软件生态大会西安站
  16. 计算机网络技术赚钱,计算机网络技术-.ppt
  17. docker+selenium+node-chrome-debug(node-firefox-debug)完成自动化测试环境的部署
  18. delphi多线程TThread类介绍
  19. 算法概述——四大算法总结
  20. python可以实现什么炫酷图形吗_我是Python小玩家,一行代码能做哪些炫酷的事情?...

热门文章

  1. Python 技术篇-系统、环境变量配置后python不生效问题解决方法,python服务命令行重启方法
  2. CTFshow php特性 web110
  3. YTU 1495 蛇行矩阵 YTU 1607 字符棱形YTU 1959 图案打印YTU 2016 打印金字塔
  4. Java中static的作用详解_java中static作用详解
  5. 求积问题[体会Python至简之道]
  6. java多线程共享信息_java多线程信息共享
  7. 滚动条全局样式修改与局部修改
  8. 随笔-使用时间管理有感
  9. 百度云使用第三方工具下载文件
  10. 【Bootloader】探究bootloader,分析u-boot源码