MySQL中的外键是什么、有什么作用

database

MySQL外键的作用:

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值!

我们来建两个表

CREATE TABLE `example1` (

`stu_id` int(11) NOT NULL DEFAULT "0",

`course_id` int(11) NOT NULL DEFAULT "0",

`grade` float DEFAULT NULL,

PRIMARY KEY (`stu_id`,`course_id`)

);

CREATE TABLE `example2` (

`id` int(11) NOT NULL,

`stu_id` int(11) DEFAULT NULL,

`course_id` int(11) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `f_ck` (`stu_id`,`course_id`),

CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`)

);

insert into example1 (stu_id,course_id,grade)values(1,1,98.5),(2,2,89);

insert into example2 (id,stu_id,course_id)values(1,1,1),(2,2,2);

我们建了

example1表,里面包含stu_id学号,course_id课程号,grade分数

example2表,里面包含id,stu_id学号,course_id课程号,然后建立外键

分别插入数据到两个表中。

我们把example2中的stu_id和course_id称为example2表的外键,example1是父表,example2是字表,两个表形成关联,必须字表的数据删除后,才能删除父表中的对应数据

现在我们来删除example1中的一条数据

delete from example1 where stu_id=2;

会发现报错

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`example3`, CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example2` (`stu_id`, `course_id`))

因为example2中的数据关联了example1的数据,这样是删不了的,达到了外键的作用;

然后我们来先删除example2表中的数据,再删除example1表中的数据

delete from example2 where stu_id=2;


delete from example1 where stu_id=2;

这样就成功了;

事件触发限制:

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

我们来看看事件触发限制是干嘛的。。。

我们先删除外键,然后重新建立外键带上事件触发限制

alter table example2 drop foreign key f_ck; alter table example2 add CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`) ON DELETE CASCADE ON UPDATE CASCADE;

我们先查看一下数据

mysql> select * from example1;select * from example2;

+--------+-----------+-------+

| stu_id | course_id | grade |

+--------+-----------+-------+

| 1 | 1 | 98.5 |

+--------+-----------+-------+

1 row in set (0.00 sec)

+----+--------+-----------+

| id | stu_id | course_id |

+----+--------+-----------+

| 1 | 1 | 1 |

+----+--------+-----------+

1 row in set (0.00 sec)

这时example1和example2中的stu_id和course_id都是1,

再来修改example1表中的数据看看

update example1 set stu_id=3,course_id=3 where stu_id=1;

再来查看数据

mysql> select * from example1;select * from example2;

+--------+-----------+-------+

| stu_id | course_id | grade |

+--------+-----------+-------+

| 3 | 3 | 98.5 |

+--------+-----------+-------+

1 row in set (0.00 sec)

+----+--------+-----------+

| id | stu_id | course_id |

+----+--------+-----------+

| 1 | 3 | 3 |

+----+--------+-----------+

1 row in set (0.00 sec)

发现没,example1和example2中的stu_id和course_id都变成了3

我们在来删除example1表中的数据

delete from example1 where stu_id=3;

会发现可以删除,而且example2中的数据也没有了;

其实啊,外键就这个作用,保持数据一致性,完整性,是不让改还是一起改,由事件触发器决定;

 

© 著作权归作者所有

打赏

点赞 (0)

收藏 (0)

分享

微博

QQ

微信

打印

举报

上一篇:

PHP Opcache的工作原理

下一篇:

laravel 配置MySQL读写分离

php开源社区

粉丝 1

博文 399

码字总数 575696

作品 0

长沙

技术主管

关注

私信

提问

加载中

请先登录后再评论。

删除一条评论

评论删除后,数据将无法恢复

取消

确定

相关文章

最新文章

Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华

2013/11/24

2W

22

我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥

2014/05/31

976

3

beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie

2014/06/25

2.7W

22

在多个浏览器上运行脚本--Queen

假设你想和朋友们玩这么个游戏:你写下某个数字,然后让朋友们猜你写的是什么数字。你的朋友们将不断的给你一些猜测的数字,直到猜中为止。 现在想象你的朋友都是使用的浏览器,这个游戏就相...

匿名

2013/01/24

4.7K

1

数据库代码辅助工具--MaoCaiJun.Database

MaoCaiJun.DataBase 是一个用于 Microsoft Visual Studio 的数据库代码生成组件。它是基于 xml 文件的代码创建工具,支持sql2000,sql2005,sql2008,access, SQLite MaoCaiJun.Database 数据库...

mccj

2013/02/06

2.5K

1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hacker News 简讯 2020-08-15

最后更新时间: 2020-08-15 05:01 Welders set off Beirut blast while securing explosives - (maritime-executive.com) 焊工在固定炸药的同时引爆了贝鲁特爆炸 得分:284 | 评论:261 Factor......

FalconChen

今天

24

0

OSChina 周六乱弹 —— 老椅小猫秋乡梦 梦里石台堆小鱼

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @小小编辑 :《MOM》- 蜡笔小心 《MOM》- 蜡笔小心 手机党少年们想听歌,请使劲儿戳(这里) @狄工 :腾讯又在裁员了,35岁以上清退,抖音看到...

小小编辑

今天

83

1

构建高性能队列,你不得不知道的底层知识!

前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 上一节,我们一起学习了如何将递归改写为非递归,其中,用到的数据结构主要是栈。 栈和队列...

彤哥读源码

今天

17

0

Anaconda下安装keras和tensorflow

Anaconda下安装keras和tensorflow 一、下载并安装Anaconda: Anaconda下载 安装步骤: 如果是多用户操作系统选择All Users,单用户选择Just Me 选择合适的安装路径 然后勾选这个,自动配置环境...

Atlantis-Brook

今天

15

0

滴滴ElasticSearch千万级TPS写入性能翻倍技术剖析

桔妹导读:滴滴ElasticSearch平台承接了公司内部所有使用ElasticSearch的业务,包括核心搜索、RDS从库、日志检索、安全数据分析、指标数据分析等等。平台规模达到了3000+节点,5PB 的数据存储...

滴滴技术

今天

13

0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSCHINA 社区

关于我们

联系我们

合作伙伴

Open API

在线工具

码云 Gitee.com

企业研发管理

CopyCat-代码克隆检测

实用在线工具

微信公众号

OSCHINA APP

聚合全网技术文章,根据你的阅读喜好进行个性推荐

下载 APP

©OSCHINA(OSChina.NET)

工信部

开源软件推进联盟

指定官方社区

深圳市奥思网络科技有限公司版权所有

粤ICP备12009483号

顶部

以上是 MySQL中的外键是什么、有什么作用 的全部内容, 来源链接: utcz.com/z/535186.html

回到顶部