在本文中,我們將學習如何通過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)
現在,我們唯一的一條博客數據已經有了兩條評論數據,如果由於任何原因需要更新博客及其評論數據的話,可以通過下列命令完成: