任何使用mysql开发过小型数据库驱动的web应用程序的人都知道,在关系数据库中创建、检索、更新和删除表是一个相对简单的过程。理论上,只要掌握最常见的SQL语句的用法,熟悉自己选择使用的服务器端脚本语言,就足以应对MySQL表所需的各种操作,尤其是在使用快速的MyISAM数据库引擎时。然而,即使是最简单的情况,事情也比我们想象的复杂得多。我们用一个典型的例子来说明。假设你正在运营一个博客网站,你几乎每天都要更新,网站允许访问者对你的帖子发表评论。
在这种情况下,我们的数据库模式应该包括至少两个MyISAM表,一个用于存储您的博客文章,另一个用于处理访问者的评论。显然,这两个表之间是一对多的关系,所以我们需要在第二个表中定义一个外键,以便在更新或删除数据行时保持数据库的完整性。
对于上面这样的应用程序,不仅维护两个表的完整性是一个严峻的挑战,而且最大的困难是我们必须在应用程序级别维护它们的完整性。这是大多数在开发期间不需要事务的web项目所采用的方法,因为MyISAM表可以提供出色的性能。
当然,这是有代价的。正如我前面所说的,应用程序必须维护数据库的完整性和一致性,这意味着应该实现更复杂的编程逻辑来处理表之间的关系。虽然使用抽象层和ORM模块可以简化数据库访问,但是随着应用程序所需数据表数量的增加,处理它们所需的逻辑无疑会变得更加复杂。
那么,对于MySQL来说,有没有数据库级的外键处理方法来帮助维护数据库的完整性呢?还好答案是肯定的!MySQL也可以支持InnoDB表,因此我们可以用非常简单的方式处理外键约束。这个特性允许我们触发某些操作,比如更新和删除表中的一些数据行,以维护预定义的关系。
凡事有利有弊。使用InnoDB表的主要缺点是它们比MyISAM慢,尤其是在必须查询许多表的大规模应用程序中。幸运的是,MySQL新版本的MyISAM表已经支持外键约束。
本文将介绍如何将外键约束应用于InnoDB表。此外,我们将使用一个简单的基于php的MySQL抽象类来创建相关的示例代码;当然,你也可以使用其他你喜欢的服务器端语言。现在,我们来介绍如何将外键约束应用于MySQL。
何时使用外键约束
老实说,在MySQL中使用InnoDB表时,并不一定要使用外键约束。但是,对于外键约束在某些情况下的作用,我们将通过前述例子的代码进行具体说明。它包括两个MyISAM表,分别用于存储博客文章和评论。
在定义数据库模式时,我们应该通过在存储评论的表中创建一个外键来建立这两个表之间的一对多关系,以便其中的数据行(即评论)与特定的博客文章相对应。以下是创建示例MyISAM表的基本SQL代码:
DROPTABLEIFEXISTS`test`.`blogs`; CREATETABLE`test`.`blogs`( `id`INT(10)UNSIGNEDAUTO_INCREMENT, `title`TEXT, `content`TEXT, `author`VARCHAR(45)DEFAULTNULL, PRIROSEKEY(`id`) )ENGINE=MyISAMDEFAULTCHARSET=utf8; DROPTABLEIFEXISTS`test`.`comments`; CREATETABLE`test`.`comments`( `id`INT(10)UNSIGNEDAUTO_INCREMENT, `blog_id`INT(10)UNSIGNEDDEFAULTNULL, `comment`TEXT, `author`VARCHAR(45)DEFAULTNULL, PRIROSEKEY(`id`) )ENGINE=MyISAMDEFAULTCHARSET=utf8;上面,我们刚刚定义了两个MyISAM表,它们构成了blog应用程序的数据层。可以看到,第一个表叫做blogs,它由一些含义明显的字段组成,用来存储每篇博文的ID、标题和内容,最后是作者。第二个表名为comments,用于存储关于每篇博客文章的评论。它将博文的ID作为外键,从而建立一对多的关系。
到目前为止,我们的工作很简单,因为我们只创建了两个简单的MyISAM表。接下来,我们要做的是用一些记录填充这些表,以便进一步演示当删除第一个表中的条目时,那些操作应该在另一个表中执行。
更新和维护数据库的完整性。
在前一部分中,我们创建了两个MyISAM表作为博客应用程序的数据层。当然,上面的介绍很简单,还需要进一步讨论。为此,我们将使用SQL命令在这些表中填充一些记录,如下所示:
INSERTINTOblogs(id,title,content,author)VALUES(NULL,'Titleofthefirstblogentry','Contentofthefirstblogentry','Ian') INSERTINTOcomments(id,blog_id,comment,author)VALUES(NULL,1,'Commentingfirstblogentry','SusanNorton'),(NULL,1,'Commentingfirstblogentry','RoseWilson')上面的代码实际上模拟了读者Susan和Rose在我们第一篇博客上评论的情况。现在假设我们想用另一篇文章更新第一个博客。当然,这种情况是有可能的。
在这种情况下,为了保持数据库的一致性,comments表也必须相应地进行更新,或者手动更新,或者通过处理数据层的应用程序进行更新。对于本例,我们将使用SQL命令来完成更新,如下所示:
UPDATEblogsSETid=2,title='Titleofthefirstblogentry',content='Contentofthefirstblogentry',author='JohnDoe'WHERE关键词:MySQL,数据库,MySQL之外
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227197.html