详解MySQL 外键约束

官方文档:
https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

1.外键作用:

MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。

2.外键的使用条件

  • 两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持)
  • 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
  • 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以。

3.创建语法

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (col_name, ...)
    REFERENCES tbl_name (col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

CASCADE:表示父表在进行更新和删除时,更新和删除子表相对应的记录
RESTRICT和NO ACTION:限制在子表有关联记录的情况下,父表不能单独进行删除和更新操作
SET NULL:表示父表进行更新和删除的时候,子表的对应字段被设为NULL

4.案例演示

以CASCADE(级联)约束方式

1. 创建势力表(父表)country
create table country (
id int not null,
name varchar(30),
primary key(id)
);

2. 插入记录
insert into country values(1,'西欧');
insert into country values(2,'玛雅');
insert into country values(3,'西西里');

3. 创建兵种表(子表)并建立约束关系
create table solider(
id int not null,
name varchar(30),
country_id int,
primary key(id),
foreign key(country_id) references country(id) on delete cascade on update cascade,
);

4. 参照完整性测试
insert into solider values(1,'西欧见习步兵',1);
#插入成功
insert into solider values(2,'玛雅短矛兵',2);
#插入成功
insert into solider values(3,'西西里诺曼骑士',3)
#插入成功
insert into solider values(4,'法兰西剑士',4);
#插入失败,因为country表中不存在id为4的势力

5. 约束方式测试

insert into solider values(4,'玛雅猛虎勇士',2);
#成功插入
delete from country where id=2;
#会导致solider表中id为2和4的记录同时被删除,因为父表中都不存在这个势力了,那么相对应的兵种自然也就消失了
update country set id=8 where id=1;
#导致solider表中country_id为1的所有记录同时也会被修改为8

以SET NULL约束方式

1. 创建兵种表(子表)并建立约束关系

drop table if exists solider;
create table solider(
id int not null,
name varchar(30),
country_id int,
primary key(id),
foreign key(country_id) references country(id) on delete set null on update set null,
);

2. 参照完整性测试

insert into solider values(1,'西欧见习步兵',1);
#插入成功
insert into solider values(2,'玛雅短矛兵',2);
#插入成功
insert into solider values(3,'西西里诺曼骑士',3)
#插入成功
insert into solider values(4,'法兰西剑士',4);
#插入失败,因为country表中不存在id为4的势力

3. 约束方式测试

insert into solider values(4,'西西里弓箭手',3);
#成功插入
delete from country where id=3;
#会导致solider表中id为3和4的记录被设为NULL
update country set id=8 where id=1;
#导致solider表中country_id为1的所有记录被设为NULL

以NO ACTION 或 RESTRICT方式 (默认)

1. 创建兵种表(子表)并建立约束关系

drop table if exists solider;
create table solider(
id int not null,
name varchar(30),
country_id int,
primary key(id),
foreign key(country_id) references country(id) on delete RESTRICT on update RESTRICT,
);

2. 参照完整性测试

insert into solider values(1,'西欧见习步兵',1);
#插入成功
insert into solider values(2,'玛雅短矛兵',2);
#插入成功
insert into solider values(3,'西西里诺曼骑士',3)
#插入成功
insert into solider values(4,'法兰西剑士',4);
#插入失败,因为country表中不存在id为4的势力

3. 约束方式测试

insert into solider values(4,'西欧骑士',1);
#成功插入
delete from country where id=1;
#发生错误,子表中有关联记录,因此父表中不可删除相对应记录,即兵种表还有属于西欧的兵种,因此不可单独删除父表中的西欧势力
update country set id=8 where id=1;
#错误,子表中有相关记录,因此父表中无法修改

以上就是详解MySQL 外键约束的详细内容,更多关于MySQL 外键约束的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解MySQL中的外键约束问题

    使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建.检索.更新和删除等操作都是些比较简单的过程.理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务器端脚本语言,就足以应付对MySQL表所需的各种操作了,尤其是当您使用了快速MyISAM数据库引擎的时候.但是,即使在最简单的情况下,事情也要比我们想象的要复杂得多.下面我们用一个典型的例子进行说明.假设您正在运行一个博客网站,您几乎天天更新,并且该站点允许访问者评论您的帖子. MySQL外键约束条件

  • MySQL外键约束常见操作方法示例【查看、添加、修改、删除】

    本文实例讲述了MySQL外键约束常见操作方法.分享给大家供大家参考,具体如下: 1. 查看数据库表创建的sql语句 show create table vip 2. 查看外键的约束名 CREATE TABLE `vip` ( `id` int(11) NOT NULL AUTO_INCREMENT, `address` varchar(255) DEFAULT NULL, `code` varchar(255) DEFAULT NULL, `mobile` varchar(255) DEFAUL

  • MySQL删除有外键约束的表数据方法介绍

    在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. 禁用外键约束,我们可以使用: SETFOREIGN_KEY_CHECKS=0; 然后再删除数据 启动外键约束,我们可以使用: SETFOREIG

  • MySQL 关闭子表的外键约束检察方法

    准备: 定义一个教师表.一个学生表:在学生表中引用教师表ID create table teachers(teacherID int not null auto_increment primary key,teacherName varchar(8)); create table students(studentID int not null auto_increment primary key,teacherID int not null,studentName varchar(8), con

  • MySQL外键约束的禁用与启用命令

    MySQL外键约束的禁用与启用: MySQL外键约束是否启用是通过一个全局变量标示的: FOREIGN_KEY_CHECKS=0; 禁用状态 FOREIGN_KEY_CHECKS=1; 启用状态 查看当前FOREIGN_KEY_CHECKS的值可用如下命令: SELECT @@FOREIGN_KEY_CHECKS; 禁用外键约束: SET FOREIGN_KEY_CHECKS=0; 启用外键约束: SET FOREIGN_KEY_CHECKS=1; 以上这篇MySQL外键约束的禁用与启用命令就是

  • MySQL删除表的时候忽略外键约束的简单实现

    删除表不是特别常用,特别是对于存在外键关联的表,删除更得小心.但是在开发过程中,发现Schema设计的有问题而且要删除现有的数据库中所有的表来重新创建也是常有的事情:另外在测试的时候,也有需要重新创建数据库的所有表.当然很多自动化工具也可以做这样的事情. 删除表的时候有时会遇到这样的错误消息: ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails 这是因为你尝试删除的表中的

  • 详解MySQL 外键约束

    官方文档: https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html 1.外键作用: MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 2.外键的使用条件 两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持) 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立: 外键关系的两个表的列必须

  • MySQL外键约束(Foreign Key)案例详解

    目录 一.MySQL外键约束作用 二.外键约束创建 (一)创建外键约束的条件 (二)在创建数据表时创建外键约束 (三)在创建数据表后添加外键约束 三.外键约束功能演示 总结 今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL外键约束详解. 一.MySQL外键约束作用 外键约束(Foreign Key)即数据库中两个数据表之间的某个列建立的一种联系.这种联系通常是以实际场景中含义完全相同的字段所造成的.MySQL通过外键约束的引入,可以使得数据表中的数据完整性更强,也更符合显示情况.下

  • MySQL外键约束详解

    目录 一.MySQL外键约束作用 二.外键约束创建 (一)创建外键约束的条件 (二)在创建数据表时创建外键约束 (三)在创建数据表后添加外键约束 三.外键约束功能演示 今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL外键约束详解. 一.MySQL外键约束作用 外键约束(Foreign Key)即数据库中两个数据表之间的某个列建立的一种联系.这种联系通常是以实际场景中含义完全相同的字段所造成的.MySQL通过外键约束的引入,可以使得数据表中的数据完整性更强,也更符合显示情况.下面,我

  • MySQL外键约束的实例讲解

    MySQL的外键约束是用来在两个表之间建立链接的,其中一个表发生变化,另外一个表也发生变化.从这个特点来看,它主要是为了保证表数据的一致性和完整性的. 对于两个通过外键关联的表,相关联字段中主键所在的表是主表,也称之为父表,外键所在的表是从表,也称之为子表,定义外键的时候需要遵守几个规则: 1.父表必须已经存在于数据库中,或者是当前正在创建的表.如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照. 2.必须为父表定义主键. 3.主键不能包含空值,但允许在外键中出现

  • MySQL 外键约束和表关系相关总结

    目录 外键(Foreign Key) 如何确定表关系 如何建立表关系 一对多关系 - 员工表和部门表 多对多 一对一 表关系总结 外键(Foreign Key) 按照上述所说,一张表存储员工信息会极大的浪费资源,重复数据太多,这个问题就类似于将所有的代码都写在了一个py文件中,因此我们可以将一个表拆成不同的表,在这不同的表之间建立关联,而建立关联就需要使用外键foreign key.外键也属于约束条件的一种. 如何确定表关系 表与表之间的关系有三种一对多.多对多.一对一.那么如何确定表与表之间的

  • MySQL外键约束(FOREIGN KEY)案例讲解

    MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用.对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表). 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性.比如,一个水果摊,只有苹果.桃子.李子.西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果.桃子.李子和西瓜,其它的水果都是不能购买的. 主表删除某条记录时,从表中与之对应的记录也必须有相应的改变.一个表

  • 详解MySQL主键唯一键重复插入解决方法

    目录 解决方案: 1. IGNORE 2. REPLACE 3. ON DUPLICATE KEY UPDATE 我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被允许有重复值: CREATE TABLE stuInfo ( id INT NOT NULL COMMENT '序号', name VARCHAR(20) NOT NULL DEFAULT '' COMMENT '姓名', age INT NOT NULL DEFAULT 0 COMMENT '年龄', PRIMA

  • Mysql外键约束的创建与删除的使用

    目录 创建表时创建外键 给存在的表添加外键 删除外键约束 创建表时创建外键 创建两个表格, 一个名为class, create table classes( id int not null primary key, name varchar(30) ); 另一个名为student create table student( sid int not null primary key, sname varchar(30), cid int not null, constraint fk_cid fo

随机推荐