一、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表。或者是把外键删除掉后,两张表的删除顺序就不分先后了。

MySQL的外键约束相关推荐

  1. mysql 创建外键约束以及注意事项

    mysql 创建外键约束以及注意事项: 创建外键: 首先创建一张区域表 CREATE TABLE `area` (`id` int(11) NOT NULL DEFAULT '0' COMMENT ' ...

  2. MySQL 主外键约束与标准SQL不同的地方

    [标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent;create table if not exists parent(id ...

  3. mysql 设置外键约束SET FOREIGN_KEY_CHECKS=1

    问题描述:Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法: 在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sq ...

  4. MySQL学习-外键约束

    在对数据库表的操作中,往往需要在多个表之间建立一定的关系,而这种关系一定具有完整性和一致性,而建立这种关系的方式就是外键. 创建外键 create table 表名(字段名 数据类型 约束,...[c ...

  5. mysql级联删除外键约束_玩转MySQL的外键约束之级联删除篇

    [IT168 文档]如今,许多关系型数据库管理系统都提供了外键约束这一强大的功能特性,它能够帮助我们自动地触发指定的动作,诸如删掉.更新数据库表的记录等,从而维护各数据库表之间预定义的关系.本文将演示 ...

  6. mysql 添加外键约束

    创建表时添加约束 create table table_name( id int primary key auto_increment, #设为主键且自动增长 name not null unique ...

  7. mysql数据库 外键约束

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

  8. 使用mysql创建外键约束_Mysql创建外键约束的两种方式

    通过给mysql的表字段添加外键约束,可以有效的保持数据的一致性和完整性,数据就不会很容易出问题. 1.创建表时直接创建外键约束create table books( bookid number(10 ...

  9. MySQL删除外键约束

    在开发中,根据需要解除两个表之间的关联,需要删除外键约束 Alter table 表名 drop foreign key 外建名: 删除student表中外键约束 可以看出,表student中的外键已 ...

最新文章

  1. python3 UDP TCP 调试回射命令行
  2. 十一、Redis五大数据类型之三Set
  3. Java提高班(一)Thread详解
  4. [云炬创业基础笔记]第七章创业资源测试5
  5. 开题报告方案论证_【实验科研】我校五项省教育规划教研专项重点课题开题
  6. html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表
  7. Java面试问题 021-030
  8. MySQL药品管理系统设计_药店药品管理系统的设计与实现(SSH,MySQL)(含录像)
  9. jquery ajax加载页面进度条,jquery网页加载进度条的实现
  10. 大学计算机课挂科补考,【挂科的同学请注意!】关于本学期补考、缓考的通知(转)...
  11. 牛顿冷却定律--画像时间衰减系数
  12. box-sizing失效的原因
  13. mysql文件上传漏洞_文件上传漏洞
  14. C# 获取笔记本电池信息 调用 Win32 Api
  15. 关联分析之Apriori学习笔记
  16. 【系统架构设计师】第一章:操作系统(1.1.1---1.1.2)操作系统的分类和结构
  17. java double 运算经度丢失问题解决
  18. 一位互联网老兵曲曲折折的 16 年!
  19. 车牌识别 代码_用31行代码构建车牌识别服务
  20. XXL-Job和Elastic-job的区别

热门文章

  1. 基于Java+SpringBoot+vue+element等动物救助平台设计和实现
  2. java 常见 错误_JAVA几个常见错误简析
  3. 163邮箱有传真服务器,网易企业邮箱邮件传真功能使用说明
  4. SQLServer查找已知数相邻前后数
  5. 如何用python的i2c教程_Micropython TPYBoard I2C的用法
  6. win10推送_Win10推送更新升级Edge浏览器:用户发现电脑速度因此变慢
  7. 数学建模学习笔记(四)——拟合算法
  8. Python数模笔记-Sklearn(2)聚类分析
  9. Python中过滤序列内置函数filter()的详解(常用)
  10. Python的os模块常用文件夹的增删改查详解