四、MySQL抽象类
现在,为了演示如何使用上述的MySQL类级联更新前文中的数据表,我们需要重新定义那两个表,以便使其只能执行这些更新的操作。这里是它们的定义,这两个表将作为我们的示例博客应用程序的数据层:
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 UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
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 UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如上所述,通过给最后一个表中的blog_id字段规定外键约束,我们已经把两个表联系在了一起,接下来让我们使用前面定义的MySQL抽象类给它们填入必要的数据。我们假设这个类被单独放入一个名为mysqlclass.php文件中,下面的脚本将向blog表中插入单篇博客文章,并向comments表中插入两则评论:
require_once 'mysqlclass.php';
$db = new MySQL('host', 'user', 'password', 'test');
//在blogs数据库表中插入新数据
$db->query("INSERT INTO blogs (id, title, content, author) VALUES (NULL,'Title of the first blog entry', 'Content of the first blog entry', 'IAN')");
$insid = $db->getInsertID();
//在comments数据库表中插入新评论
$db->query("INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, $insid, 'Commenting first blog entry', 'Tom'), (NULL, $insid, 'Commenting first blog entry', 'Rose')");
$db = new MySQL('host', 'user', 'password', 'test');
//在blogs数据库表中插入新数据
$db->query("INSERT INTO blogs (id, title, content, author) VALUES (NULL,'Title of the first blog entry', 'Content of the first blog entry', 'IAN')");
$insid = $db->getInsertID();
//在comments数据库表中插入新评论
$db->query("INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, $insid, 'Commenting first blog entry', 'Tom'), (NULL, $insid, 'Commenting first blog entry', 'Rose')");
虽然我们的这个MySQL类能够抽象地访问数据库,但是相应的SQL查询还得手工编写。同时,它正好可以使我们可以展示每当第一个表中的数据更新时,如何使用该类来更新与第一个数据表相关的评论。
执行该级联更新操作的代码片断如下所示:
//更新blogs表中的数据(comments表中的有关数据将自动更新)
$db->query("UPDATE blogs SET id = 2, title = 'Title of the first blog entry', content = 'Content of the first blog entry', author = 'John Doe' WHERE id = 1");
$db->query("UPDATE blogs SET id = 2, title = 'Title of the first blog entry', content = 'Content of the first blog entry', author = 'John Doe' WHERE id = 1");
尽管另外添加了一个与上述InnoDB表打交道的抽象类,但是触发级联更新所需的SQL代码仍然保持高度简洁。这说明,各表之间的关系的完整性仍然是在数据库级别进行维护的,而不是由PHP 5应用程序所维护的。
五、小结
到目前为止,我们详细讲解了如何通过PHP 5内置的抽象类使用外键约束来更新两个InnoDB表中的数据。 我们希望本文能够对您利用服务器端脚本使用外键约束时能够有所启发。在后面的文章中,我们将继续探讨外键约束有关的内容。