在本文中,我们将学习如何通过PHP 5的一个基本抽象类使用外键约束来更新两个InnoDB表的数据。 我们将通过具体示例来说明如何通过服务器端脚本语言来使用外键约束。
一、利用外键约束更新MySQL中的数据
现在,最流行的开源关系型管理系统非MySQL莫属,而MySQL又支持多个存储引擎,其中默认的也是速度较快的存储引擎为MyISAM,对许多读者来说,在开发自己数据库驱动的web应用程序之前,可能已经使用了它很长一段时间了。
然而,有时候我们的项目可能需要额外的特性,例如需要处理外键约束,这时我们就需要用到其它类型的MySQL存储引擎。在这种情况下,InnoDB表将非常适合我们的要求,尽管在性能方面可能比MyISAM表要稍逊一筹。大家知道,使用InnoDB表外键约束主要优点之一就是,它使我们可以在数据库级别处理和维护多个表之间的关系,而无需将此任务推给与这些表打交道的应用程序的某些模块或者程序库。
当然,前面的几篇文章中,我们已经就IndoDB表的外键约束做过相应介绍,但是那里都是通过手工方式来操作外键约束的。在本文中,我们将说明如何在更新和删除父表中的数据时,如何通过脚本语言来触发相应子表的级联更新和删除操作。
这里,我们博客应用程序的数据层由两个表构成,在前面的示例中,对这些表的操作,都是通过手工键入SQL命令完成的,现在,我们将介绍如何使用PHP程序设计语言来完成这些工作。之所以选择PHP,是因为它目前MySQL最常见的搭配语言,下面我们以PHP 5为例来说明如何外键约束操作两个InnoDB表。 通过阅读本文,您将更加真切地体会到外键约束的特性。
现在,我们开始见证PHP 5和外键约束结合在一起所带来的威力吧!
二、以级联方式更新和删除数据库中的数据
古人云,温故而知新,那么先让我们来回顾一下前面学过的内容吧。之前,我们介绍过如何运用外键约束级联更新和删除存放博客文章评论的InnoDB表中的数据。如果您尚未阅读前面的文章也不要紧,下面我们简单回顾这些内容。
这里是我们的示例中用到的两个表的定义,如下所示:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
DROP TABLE IF EXISTS `test`.`blogs`;
CREATE TABLE `test`.`blogs` (
`id` INT(10) UNSIGNED AUTO_INCREMENT,
`title` TEXT,
`content` TEXT,
`author` VARCHAR(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `test`.`comments`;
CREATE TABLE `test`.`comments` (
`id` INT(10) UNSIGNED AUTO_INCREMENT,
`blog_id` INT(10) UNSIGNED DEFAULT NULL,
`comment` TEXT,
`author` VARCHAR(45) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `blog_ind` (`blog_id`),
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的代码定义了两个表,需要注意一下第二个,因为它为“blog_id”字段规定了一个约束,所以当post表中的数据被更新和删除时,将触发相应的级联操作。
为了帮您理解这一过程,我们可以在表中填上一些数据,这时可以通过SQL语句INSERT来完成,如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
INSERT INTO blogs (id, title, content, author) VALUES (NULL,Title of the first blog entry, Content of the first blog entry, IAN)
INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, 1, Commenting first blog entry, Tom), (NULL, 1, Commenting first blog entry, Rose)
现在,我们唯一的一条博客数据已经有了两条评论数据,如果由于任何原因需要更新博客及其评论数据的话,可以通过下列命令完成: