Board logo

标题: mysql外键 [打印本页]

作者: fangzhen    时间: 2008-12-21 22:28     标题: mysql外键

在MySQL服务器3.23.44和更高版本中,InnoDB存储引擎支持对外键约束的检查功能,这些约束包括CASCADE、ON DELETE和ON UPDATE。
对于InnoDB之外的其他存储引擎,MySQL服务器能够解析CREATE TABLE语句中的FOREIGN KEY语法,但不能使用或保存它。未来将进行扩展,能够将这类信息保存到表规范文件中,以便能被mysqldump和ODBC检索。稍后,还将为MyISAM表实现外键约束。
外键增强为数据库开发人员提供了多项益处:
?         假定关联设计恰当,外键约束使得程序员更难将不一致性引入数据库。
?         数据库服务器具有集中式约束检查功能,因而没有必要在应用程序一侧执行这类检查。这样,就消除了不同应用程序使用不同方式检查约束的可能性。
?         使用级联更新和删除,简化了应用程序代码。
?         设计恰当的外键有助于以文档方式记录表间的关系。
请记住,这些好处是以数据库服务器为执行必要检查而需的额外开销为代价的。服务器额外检查会影响性能,对于某些应用程序,该特性不受欢迎,应尽量避免。(出于该原因,在一些主要的商业应用程序中,在应用程序级别上实施了外键逻辑)。
MySQL允许数据库开发人员选择要使用的方法。如果你不需要外键,并希望避免与强制引用完整性有关的开销,可选择另一种表类型取而代之,如MyISAM。(例如,MyISAM存储引擎为仅执行INSERT和SELECT操作的应用程序提供了极快的性能,这是因为插入能和检索同时进行)。请参见7.3.2节,“表锁定事宜”。
如果你不打算利用引用完整性检查具备的优点,请记住下述要点:
?         不存在服务器端外键关联检查时,应用程序本身必须处理这类关联事宜。例如,将行按恰当顺序插入表时应谨慎,并应避免产生孤立的子记录。必须能够在多记录插入操作期间更正出现的错误。
?         如果ON DELETE是应用程序所需的唯一引用完整性功能,请注意,从MySQL服务器4.0起,可以使用多表DELETE语句,用单一语句从多个表中删除行。
?         从具有外键的表删除记录时,在缺少ON DELETE的情况下,一种解决方式是为应用程序增加恰当的DELETE语句。实际上,它与使用外键同样快,而且移植性更好。
注意,使用外键在某些情况下会导致问题。
?         外键支持能处理很多引用完整性事宜,但仍需要仔细设计键的关系,以避免循环规则或不正确的级联删除组合。
?         DBA需要创建关联拓扑,这会使从备份中恢复单独表变得困难,该类情形并不罕见。(加载依赖其他表的表时,MySQL允许你临时禁止外键检查,从而降低了该难度)。请参见15.2.6.4节,“FOREIGN KEY约束”。在MySQL 4.1.1以前。重新加载时,mysqldump能够生成自动利用该性能的转储文件。
注意,SQL中的外键用于检查和强制引用完整性,而不是联合表。如果打算用SELECT语句获取多个表的结果,可在表之间执行联合操作:
SELECT * FROM t1, t2 WHERE t1.id = t2.id;请参见13.2.7.1节,“JOIN语法”。
ODBC应用程序常使用不带“ON DELETE ...”的FOREIGN KEY语法来生成自动WHERE子句。




欢迎光临 PHP开发笔记 (http://phpvi.com/) Powered by Discuz! 6.1.0