MySQL数据库中的外键约束详解_MySQL
MySQL数据库中的外键约束详解_MySQL 使用MySQL开发过数据库驱动的小型web应用程序的人都知道,对关系数据库的表进行创建、检索、更新和删除等操作都是些比较简单的过程。理论上,只要掌握了最常见的SQL语句的用法,并熟悉您选择使用的服务器端脚本语言,就足以应付对MySQL表所需的各种操作了,尤其是当您使用了快速MyISAM数据库引擎的时候。但是,即使在最简单的情况下,事情也要比我们想象的要复杂得多。下面我们用一个典型的例子进行说明。假设您正在运行一个博客网站,您几乎天天更新,并且该站点允许访问者评论您的帖子。 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=MyISAM 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`)) ENGINE=MyISAM DEFAULT CHARSET=utf8; 上面,我们只是定义了两个MyISAM表,它们构成了博客应用程序的数据层。如您所见,第一个表名为blogs,它由一些含义很明显的字段组成,分别用于存放每篇博客文章的ID、标题和内容,最后是作者。第二个表名为comments,用于存放各篇博客文章的有关评论,它将博客文章的ID作为它的外键,从而建立起一对多的关系。 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', 'Susan Norton'), (NULL, 1, 'Commenting first blog entry', 'Rose Wilson')
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 UPDATE comments SET blog_id = 2 WHERE blod_id = 1
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 说,这里所做的就是让MySQL以级联方式维护数据库完整性,这意味着当某个博客更新时,与之相连的注释也要立即反应此变化,重要的是这一功能的实现并非在应用程序层完成的。 "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数据库中的外键约束详解_MySQL的内容, |