MySQL的外键约束

一、MySQL外键

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

1、外键的好处
  可以使得两张表关联,保证数据的一致性和实现一些级联操作。
  
2、外键的作用
  保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!

3、建立外键的前提
  两个表必须是InnoDB表类型。
  使用在外键关系的域必须为索引型(Index)。
  使用在外键关系的域必须与数据类型相似

4、创建的步骤
  指定主键关键字: foreign key(列名)
  引用外键关键字: references <外键表名>(外键列名)

5、事件触发限制
  on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action

二、创建外键

MySQL创建外键语法:

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 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数据库和两个表:categoriesproducts。每个类别都有一个或多个产品,每个产品只属于一个类别。 products表中的cat_id字段被定义为具有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;

四、添加外键

1、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;

2、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_1products_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;

七、注意

1、删除带有外键约束的表
  创建department表:

create table department(
dept_name varchar(20),
budget int,
descript varchar(20),
primary key(dept_name)

  创建course表:

create table course(
course_id varchar(20),
deptnames varchar(20),
credits int,
foreign key(deptnames) references department(dept_name));

  course表的外键deptnames指向department表的dept_name。若要删除departmentcourse这两个表,则必须先删除course表,再删除department表。或者是把外键删除掉后,两张表的删除顺序就不分先后了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速排序(C语言)

快速排序 快速排序是一种不稳定排序&#xff0c;它的时间复杂度为O(nlgn)&#xff0c;最坏情况为O(n2)&#xff1b;空间复杂度为O(nlgn)。 这种排序方式是对于冒泡排序的一种改进&#xff0c;它采用分治模式&#xff0c;将一趟排序的数据分割成独立的两部分&#xff0c;其中一…

前端页面-不可编辑控制

1. spring-form 库的使用和不可编辑控制 <form:input path"title" htmlEscape"false" class"form-control required"/> 页面元素不可编辑控制 readOnly“true”&#xff1b; 对input&#xff0c;textArea 有效 disadbled"true";…

js+获取当前域名及跳转、下载操作

一、js获取当前域名 1、方法一 var domain document.domain;2、方法二 var domain window.location.host;3、注意问题   由于获取到的当前域名不包括 http://&#xff0c;所以把获取到的域名赋给 a 标签的 href 时&#xff0c;别忘了加上 http://&#xff0c;否则单击链…

哈希表,哈希算法(C语言)

哈希表 哈希表&#xff0c;又称散列表&#xff0c;常用于在海量数据中查找数据 哈希表中元素是由哈希函数确定的。将数据元素的关键字key作为自变量&#xff0c;通过一定的函数关系H(称为哈希函数)&#xff0c;计算出的值&#xff0c;即为该元素的存储地址。其优点是&#xf…

【OP放大器】在不拆开OP放大器的情况下查一查它是否坏掉或饱和。

用高阻抗的示波器观测工作中的同相电压&#xff0b;点电压即可。 观测虚拟短路的点时&#xff0c;掌握工作中的诸条件&#xff0c;例如电源电压或周围温度的变化、负载的变动、对各种输入信号OP放大器及周边电路是否正常工作等&#xff0c;就可以得到很好的线索。转载于:https:…

Apache配置多个监听端口和访问网站的方法

一个apache服务器的vhost.conf配置文件可以设置Apache监听多个端口&#xff0c;打开Apache的配置文件httpd.conf&#xff0c;在 Listen 80 下面添加多个监听端口如&#xff1a; Listen 8010 Listen 8020 Listen 8030 这样就在vhosts.conf配置文件中增加了8010、8020和8030端…

图的邻接矩阵(C语言)

邻接矩阵 无向图和有向图在邻接矩阵中的表示方法&#xff1a; 无向图和有向图大同小异&#xff0c;在这里只以无向图为例&#xff0c;代码部分通过简单调整即可对应编译有向图 邻接矩阵数据类型定义 #define MaxVertices 100 //定义最大容量 typedef struct{ //包含权的邻…

MySQL安装成功后dos命令行设置密码

我在windows7上安装好MySQL数据库后&#xff0c;添加了MySQL的安装目录D:\wamp\MySQL\bin;到环境变量中&#xff0c;这样就可以在任何目录下使用mysql。为了安全性考虑&#xff0c;需要设置MySQL数据库的密码。通过dos命令行设置的方式如下&#xff1a; 一、进入dos命令行 按…

图的邻接表表示法(C语言)

邻接表 邻接表数据结构类型如下&#xff1a; #define MaxVertices 100 typedef struct node{ //边表 int adjvex;node* next; }EdgeNode; typedef struct{ //顶点表 int vertex; EdgeNode* edgenext; }VertexNode; typedef VertexNode AdjList[MaxVertices];//…

最小生成树构造算法--Prim算法,Kruskal算法(C语言)

最小生成树 最小生成树&#xff08;minimum spanning tree&#xff09;是由n个顶点&#xff0c;n-1条边&#xff0c;将一个连通图连接起来&#xff0c;且使权值最小的结构。 最小生成树可以用Prim&#xff08;普里姆&#xff09;算法或kruskal&#xff08;克鲁斯卡尔&#xff…

屏蔽烦人的百度搜索热点

开发时&#xff0c;在百度上搜索一些资料时&#xff0c;总是不经意看到百度搜索热点的一些新闻&#xff0c;然后经不住诱惑的标题就不经意间点了进去&#xff0c;然后就是连锁反应了。。等再次回到开发时已经是半小时之后的事了。又要把想要的东西重新捋一遍&#xff0c;导致开…

矩阵在竞赛中的应用

矩阵乘法代码&#xff1a; struct matrix {int n, m;int a[100][100]; }; // A.m B.n matrix matrix_mul(matrix A, matrix B) {matrix C;C.n A.n;C.m B.m;for (int i 0; i < A.n; i) {for (int j 0; j < B.m; j) {C.a[i][j] 0;for (int k 0; k < A.m; k) {C.a…

连通图遍历策略之广度优先搜索(C语言)

广度优先搜素&#xff08;BFS&#xff09; 广度优先搜索(又称宽度优先搜索)算法是最简便的图的搜索算法之一&#xff0c;该算法属于一种盲目搜寻法&#xff0c;目的是系统地展开并检查图中的所有节点&#xff0c;以找寻结果。换句话说&#xff0c;它并不考虑结果的可能位置&am…

多条件组合查询

一、效果图 二、前端代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Jquery分类</title> <script src"http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></sc…

“三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候&#xff0c;经常会被问到&#xff1a;你知道“3次握手&#xff0c;4次挥手”吗&#xff1f;这时候我会“胸有成竹”地“背诵”前期准备好的“答案”&#xff0c;第一次怎么怎么&#xff0c;第二次……答完就没有下文了&#xff0c;面试官貌似也没有…

连通图遍历策略之深度优先搜索(C语言)

深度优先搜素&#xff08;DFS&#xff09; 深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中&#xff0c;当一个超链被选择后&#xff0c;被链接的HTML文件将执行深度优先搜索&#…

PHP+cURL扩展的使用

PHP 支持 Daniel Stenberg 创建的 libcurl 库&#xff0c;能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完…

dwc_otg驱动 BUG: sleeping function called from invalid context at mm/page_alloc.c

方案商的开发板上otg功能只能做device&#xff0c;硬件看过后说没有5v供电&#xff0c;加上后能够识别U盘了&#xff0c;但是内核报了错 [ 3.264000] usb 2-1: new high-speed USB device number 2 using dwc_otg[ 3.280000] BUG: sleeping function called from invalid conte…

单源最短路径之迪杰斯特拉算法(C语言)

Dijkstra&#xff08;迪杰斯特拉&#xff09;算法 采用广度优先搜索思想&#xff0c;对有向赋权图寻找最短路径。 该算法对于不含负权的有向图来说&#xff0c;是目前已知的最快的单源最短路径算法。 时间复杂度&#xff1a;O&#xff08;n^2&#xff09; 基本原理&#xf…

PHP_VERSION获取php版本

PHP_VERSION PHP_VERSION&#xff1a;当前PHP的版本号。 <?phpecho PHP_VERSION; ?>结果&#xff1a;5.4.45 很多时候我们只需要获取大的版本号就够用了&#xff0c;因为大的版本号决定了很多新的特性和函数。因此用substr()函数获取前三位字符。 <?phpecho su…