0

0

MySQL的外键约束级联删除_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:30:57

|

1715人浏览过

|

来源于php中文网

原创

Mysql外键

bitsCN.com

mysql的外键约束级联删除

 

在更新数据库时使用外键约束

 

  第一个表存储一些简单博客数据,而第二个表则存放这些博客的有关评论。这例子的巧妙之处在于,它给子表定义了一个外键约束,从而允许我们在博客文章被删除时自动地删除有关的所有评论。下面给出这两个表的定义,它们建立了一个一对多的关系:

 

01DROP   TABLE   IF   EXISTS  `test`.`blogs`;0203CREATE   TABLE  `test`.`blogs` (0405`id`  INT ( 10 ) UNSIGNED AUTO_INCREMENT,0607`title`  TEXT ,0809`content`  TEXT ,1011`author`  VARCHAR ( 45 )  DEFAULT   NULL ,1213PRIMARY   KEY  (`id`)1415) ENGINE = InnoDB  DEFAULT  CHARSET = utf8;1617   1819DROP   TABLE   IF   EXISTS  `test`.`comments`;2021CREATE   TABLE  `test`.`comments` (2223`id`  INT ( 10 ) UNSIGNED AUTO_INCREMENT,2425`blog_id`  INT ( 10 ) UNSIGNED  DEFAULT   NULL ,2627`comment`  TEXT ,2829`author`  VARCHAR ( 45 )  DEFAULT   NULL ,3031PRIMARY   KEY  (`id`),3233KEY  `blog_ind` (`blog_id`),3435CONSTRAINT  `comments_ibfk_1`  FOREIGN   KEY  (`blog_id`)  REFERENCES  `blogs` (`id`)  ON   UPDATE   CASCADE3637) ENGINE = InnoDB  DEFAULT  CHARSET = utf8;

 

  除了给以上两个InnoDB表定义一些简单字段外,上述的代码还使用了一个外键约束,使得每当父表的“id”键更新时,表comments的相应内容也会级联更新。给父字段“id”定义约束的代码如下所示:

1CONSTRAINT  `comments_ibfk_1`  FOREIGN   KEY  (`blog_id`)  REFERENCES  `blogs` (`id`)  ON   UPDATE   CASCADE

 

 

   InnoDB引擎除了可以规定根据父表完成的操作对子表进行的级联更新以外,还可以执行其他的操作,包括“NO ACTION”和“RESTRICT”,这样即使父表发生更新或者删除操作,也不会引起对子表的任何操作。

 

  现在,根据上面的MySQL表的定义,填充如下所示的数据:

 

1INSERT   INTO  blogs (id, title, content, author)  VALUES  ( NULL , ' Title of the first blog entry ' ,  ' Content of the first blog entry ' ,  ' Tom ' )23INSERT   INTO  comments (id, blog_id, comment, author)  VALUES  ( NULL ,  1 ,  ' Commenting first blog entry ' ,  ' Susan Norton ' ), ( NULL ,  1 ,  ' Commenting first blog entry ' ,  ' Rose ' )

 

 

   然后,由于某种原因,我们更新了第一个博客数据,那么只要运行下列SQL语句,与该博客文章有关的所有评论也会随之自动更新:

 

1UPDATE  blogs  SET  id  =   2 , title  =   ' Title of the first blog entry ' , content  =   ' Content of the first blog entry ' , author  =   ' John Doe '   WHERE  id  =   1

 

 

   这看起来非常不错,对吧?前面讲过,外键约束容许您将表之间的关系的维护工作委托给数据库层,这意味着编写与数据层交互的应用程序时可以省去不少的代码。

 

  此外,我们也可以触发级联删除操作,这与前面演示的情形非常类似。因此,下面我们继续使用早先定义的两个示例表来演示当某篇博客文章的数据被删除时,如何利用外键约束删除相应的评论。

 

 

不使用外键约束时的数据删除

 

  为了说明当父表数据被删除时,外键约束在维护数据库完整性方面发挥的作用,我们将重建前面的例子,这次使用MyISAM表。首先,我们需要定义数据表,具体代码如下所示:

 

01DROP   TABLE   IF   EXISTS  `test`.`blogs`;0203CREATE   TABLE  `test`.`blogs` (0405`id`  INT ( 10 ) UNSIGNED AUTO_INCREMENT,0607`title`  TEXT ,0809`content`  TEXT ,1011`author`  VARCHAR ( 45 )  DEFAULT   NULL ,1213PRIMARY   KEY  (`id`)1415) ENGINE = MyISAM  DEFAULT  CHARSET = utf8;1617   1819DROP   TABLE   IF   EXISTS  `test`.`comments`;2021CREATE   TABLE  `test`.`comments` (2223`id`  INT ( 10 ) UNSIGNED AUTO_INCREMENT,2425`blog_id`  INT ( 10 ) UNSIGNED  DEFAULT   NULL ,2627`comment`  TEXT ,2829`author`  VARCHAR ( 45 )  DEFAULT   NULL ,3031PRIMARY   KEY  (`id`)3233) ENGINE = MyISAM  DEFAULT  CHARSET = utf8;

 

 

  好了,我们已经建好了两个示例表,需要注意的是,它们使用的是默认的MyISAM数据库引擎,所以不支持外键约束。

 

  定义的这两个表构成了博客应用程序的数据层,接下来我们在其中填上一些数据,所用的代码如下所示:

GoEnhance
GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

下载

 

1INSERT   INTO  blogs (id, title, content, author)  VALUES  ( NULL , ' Title of the first blog entry ' ,  ' Content of the first blog entry ' ,  ' Tom ' )23INSERT   INTO  comments (id, blog_id, comment, author)  VALUES  ( NULL ,  1 ,  ' Commenting first blog entry ' ,  ' Susan Norton ' ), ( NULL ,  1 ,  ' Commenting first blog entry ' ,  ' Rose ' )

 

 

   实际上,以上代码片断模拟了博客应用程序运行时,我们发布了博客并有人张贴评论时,程序在表blogs中插入一篇博客文章的有关数据,并在子表中插入有关评论的过程。现在,如果我们删除了这篇博客,那么有关的评论也应该随之删除。

 

  但是,我们该如何去做呢?别急,下面我们以SQL语句为例说明如何完成此任务:

 

1DELETE   FROM  blogs  WHERE  id  =   12DELETE   FROM  comments  WHERE  blog_id  =   1

 

 

   当然,在实际情况下,我们应该通过服务器端语言来执行这两个删除语句,而不是使用原始的SQL命令;但是这里只是举例之用,就不用考虑这么多了。

 

  我想您现在已经弄明白了使用MyISAM表时如何删除博客数据,以及有关的评论。因此,接下来我们将重新构建这个例子,不过这次我们将让数据表使用InnoDB存储引擎和一个简单的外键约束。

 

 

使用外键约束时的数据删除

 

  恰如您可以使用外键约束级联更新数据一样,InnoDB表还支持级联删除,这对于维护那些具有特定关系的数据表的一致性极为有用。

 

  下面我们举例说明,现在重新定义两个表,如下所示:

01DROP TABLE  IF  EXISTS `test`.`blogs`;0203CREATE TABLE `test`.`blogs` (0405`id`  INT ( 10 ) UNSIGNED AUTO_INCREMENT,0607`title` TEXT,0809`content` TEXT,1011`author` VARCHAR( 45 ) DEFAULT  NULL ,1213PRIMARY KEY (`id`)1415) ENGINE = InnoDB DEFAULT CHARSET = utf8;1617   1819DROP TABLE  IF  EXISTS `test`.`comments`;2021CREATE TABLE `test`.`comments` (2223`id`  INT ( 10 ) UNSIGNED AUTO_INCREMENT,2425`blog_id`  INT ( 10 ) UNSIGNED DEFAULT  NULL ,2627`comment` TEXT,2829`author` VARCHAR( 45 ) DEFAULT  NULL ,3031PRIMARY KEY (`id`),3233KEY `blog_ind` (`blog_id`),3435CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`)  ON  DELETE CASCADE3637) ENGINE = InnoDB DEFAULT CHARSET = utf8;

 

 

   现在,组成我们虚构的博客应用程序的数据层的两个表blogs和comments将使用InnoDB存储引擎。这意味着,它们能利用外键约束来删除与某博客有关的所有评论,当该博客被删除的时候。

 

  引起级联删除的SQL语句如下所示:

 

1CONSTRAINT  `comments_ibfk_1`  FOREIGN   KEY  (`blog_id`)  REFERENCES  `blogs` (`id`)  ON   DELETE   CASCADE

 

 

   现在,由于这个约束已经施加于blog表的“id”字段,所以在删除博客的同时清除有关评论将非常简单,就像运行一个DELETE命令一样,具体如下所示:

 

1DELETE   FROM  blogs  WHERE  id  =   1

 

 

   我们看到,现在事情变得简单多了。从这个例子您就可以想象得出,当数据层使用利用外键约束在数据库级别维护各表之间关系的完整性和一致性的数据表的时候,开发与这样的数据层交互的应用程序是多么的简单。

 

bitsCN.com

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Django 教程
Django 教程

共28课时 | 3.8万人学习

Excel 教程
Excel 教程

共162课时 | 14.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号