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 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 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_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;
七、注意
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
。若要删除department
,course
这两个表,则必须先删除course
表,再删除department
表。或者是把外键删除掉后,两张表的删除顺序就不分先后了。
MySQL的外键约束相关推荐
- mysql 创建外键约束以及注意事项
mysql 创建外键约束以及注意事项: 创建外键: 首先创建一张区域表 CREATE TABLE `area` (`id` int(11) NOT NULL DEFAULT '0' COMMENT ' ...
- MySQL 主外键约束与标准SQL不同的地方
[标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent;create table if not exists parent(id ...
- mysql 设置外键约束SET FOREIGN_KEY_CHECKS=1
问题描述:Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法: 在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sq ...
- MySQL学习-外键约束
在对数据库表的操作中,往往需要在多个表之间建立一定的关系,而这种关系一定具有完整性和一致性,而建立这种关系的方式就是外键. 创建外键 create table 表名(字段名 数据类型 约束,...[c ...
- mysql级联删除外键约束_玩转MySQL的外键约束之级联删除篇
[IT168 文档]如今,许多关系型数据库管理系统都提供了外键约束这一强大的功能特性,它能够帮助我们自动地触发指定的动作,诸如删掉.更新数据库表的记录等,从而维护各数据库表之间预定义的关系.本文将演示 ...
- mysql 添加外键约束
创建表时添加约束 create table table_name( id int primary key auto_increment, #设为主键且自动增长 name not null unique ...
- mysql数据库 外键约束
外部关键字 在以后我们统一将外部关键字叫做外键,外键就是另一张表中的主键. 问:外键有啥用啊? 答:外键的主要作用就是保持数据的一致性,完整性. 再问:怎么保证的呢? 答:看图. 如图有两张表,cla ...
- 使用mysql创建外键约束_Mysql创建外键约束的两种方式
通过给mysql的表字段添加外键约束,可以有效的保持数据的一致性和完整性,数据就不会很容易出问题. 1.创建表时直接创建外键约束create table books( bookid number(10 ...
- MySQL删除外键约束
在开发中,根据需要解除两个表之间的关联,需要删除外键约束 Alter table 表名 drop foreign key 外建名: 删除student表中外键约束 可以看出,表student中的外键已 ...
最新文章
- python3 UDP TCP 调试回射命令行
- 十一、Redis五大数据类型之三Set
- Java提高班(一)Thread详解
- [云炬创业基础笔记]第七章创业资源测试5
- 开题报告方案论证_【实验科研】我校五项省教育规划教研专项重点课题开题
- html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表
- Java面试问题 021-030
- MySQL药品管理系统设计_药店药品管理系统的设计与实现(SSH,MySQL)(含录像)
- jquery ajax加载页面进度条,jquery网页加载进度条的实现
- 大学计算机课挂科补考,【挂科的同学请注意!】关于本学期补考、缓考的通知(转)...
- 牛顿冷却定律--画像时间衰减系数
- box-sizing失效的原因
- mysql文件上传漏洞_文件上传漏洞
- C# 获取笔记本电池信息 调用 Win32 Api
- 关联分析之Apriori学习笔记
- 【系统架构设计师】第一章:操作系统(1.1.1---1.1.2)操作系统的分类和结构
- java double 运算经度丢失问题解决
- 一位互联网老兵曲曲折折的 16 年!
- 车牌识别 代码_用31行代码构建车牌识别服务
- XXL-Job和Elastic-job的区别
热门文章
- 基于Java+SpringBoot+vue+element等动物救助平台设计和实现
- java 常见 错误_JAVA几个常见错误简析
- 163邮箱有传真服务器,网易企业邮箱邮件传真功能使用说明
- SQLServer查找已知数相邻前后数
- 如何用python的i2c教程_Micropython TPYBoard I2C的用法
- win10推送_Win10推送更新升级Edge浏览器:用户发现电脑速度因此变慢
- 数学建模学习笔记(四)——拟合算法
- Python数模笔记-Sklearn(2)聚类分析
- Python中过滤序列内置函数filter()的详解(常用)
- Python的os模块常用文件夹的增删改查详解