MySQL的外键约束级联删除(二)
Susan Norton ' ), ( NULL , 1 , ' Commenting first blog entry ' , ' Rose ' )
实际上,以上代码片断模拟了博客应用程序运行时,我们发布了博客并有人张贴评论时,程序在表blogs中插入一篇博客文章的有关数据,并在子表中插入有关评论的过程。现在,如果我们删除了这篇博客,那么有关的评论也应该随之删除。
但是,我们该如何去做呢 别急,下面我们以SQL语句为例说明如何完成此任务:
1 DELETE FROM blogs WHERE id = 1 2 DELETE FROM comments WHERE blog_id = 1
当然,在实际情况下,我们应该通过服务器端语言来执行这两个删除语句,而不是使用原始的SQL命令;但是这里只是举例之用,就不用考虑这么多了。
我想您现在已经弄明白了使用MyISAM表时如何删除博客数据,以及有关的评论。因此,接下来我们将重新构建这个例子,不过这次我们将让数据表使用InnoDB存储引擎和一个简单的外键约束。
使用外键约束时的数据删除
恰如您可以使用外键约束级联更新数据一样,InnoDB表还支持级联删除,这对于维护那些具有特定关系的数据表的一致性极为有用。
下面我们举例说明,现在重新定义两个表,如下所示:
01 DROP TABLE IF EXISTS `test`.`blogs`; 02 03 CREATE TABLE `test`.`blogs` ( 04 05 `id` INT ( 10 ) UNSIGNED AUTO_INCREMENT, 06 07 `title` TEXT, 08 09 `content` TEXT, 10 11 `author` VARCHAR( 45 ) DEFAULT NULL , 12 13 PRIMARY KEY (`id`) 14 15 ) ENGINE = InnoDB DEFAULT CHARSET = utf8; 16 17 18 19 DROP TABLE IF EXISTS `test`.`comments`; 20 21 CREATE TABLE `test`.`comments` ( 22 23 `id` INT ( 10 ) UNSIGNED AUTO_INCREMENT, 24 25 `blog_id` INT ( 10 ) UNSIGNED DEFAULT NULL , 26 27 `comment` TEXT, 28 29 `author` VARCHAR( 45 ) DEFAULT NULL , 30 31 PRIMARY KEY (`id`), 32 33 KEY `blog_ind` (`blog_id`), 34 35 CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON DELETE CASCADE 36 37 ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
现在,组成我们虚构的博客应用程序的数据层的两个表blogs和comments将使用InnoDB存储引擎。这意味着,它们能利用外键约束来删除与某博客有关的所有评论,当该博客被删除的时候。
引起级联删除的SQL语句如下所示:
1 CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON DELETE CASCADE
现在,由于这个约束已经施加于blog表的“id”字段,所以在删除博客的同时清除有关评论将非常简单,就像运行一个DELETE命令一样,具体如下所示:
1 DELETE FROM blogs WHERE id = 1
我们看到,现在事情变得简单多了。从这个例子您就可以想象得出,当数据层使用利用外键约束在数据库级别维护各表之间关系的完整性和一致性的数据表的时候,开发与这样的数据层交互的应用程序是多么的简单。