。为此,首先要重新定义这两个示例表,以便它们可以使用特定的数据库引擎。为此,可以使用如下所示的SQL代码:
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,
PRIROSE 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,
PRIROSE 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; 这里的代码与之前的代码相比,一个明显的不同之处在于现在的这两个表使用了InnoDB存储引擎,所以能够支持外键约束。除此之外,我们还需要注意定义comments表的代码:
CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON UPDATE CASCADE 实际上,这个语句是通知MySQLMySQL,当blogs表更新时,也要更新comments表中外键blog_id的值。换句话说,这里所做的就是让MySQL以级联方式维护数据库完整性,这意味着当某个博客更新时,与之相连的注释也要立即反应此变化,重要的是这一功能的实现并非在应用程序层完成的。
两个示例MySQL表已经定义好了,现在,更新这两个表就像运行一个UPDATE语句一样简单,如下所示:
"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" 前面说过,我们无需更新comments表,因为MySQL会自动处理这一切。此外,在试图更新blogs表的数据行的时候,还可以通过去除查询的“ON UPDATE”部分或者规定“NO ACTION”和“RESTRICT”让MySQL什么也不做。当然,还可以让MySQL做其他事情,这些将在后续的文章中分别加以介绍。
通过上面的介绍,我想大家已经对如何在MySQL中的InnoDB表结合使用外键约束有了一个清晰的认识,当然,您也可以进一步编写在即的代码,以进一步加深对这一方便的数据库功能的认识。
五、小结
本文中,我们详细介绍了在MySQL中结合使用外键约束和InnoDB表的基础知识。就像您在本文的示例所看到的那样,当父表的内容发生更新时触发对子表数据项的级联更新是已经轻而易举的事情,同时还说明了处理数据层的应用程序如何免除对这一特性的实现。当然,我们也可以在父表删除数据行时提供同样的级联效应,这一点我们将在后面的文章中进行阐述。