外键笔记


新建两个表

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
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

INSERT INTO blogs (id, title, content, author) VALUES (NULL,'Title of the first blog entry', 'Content of the first blog entry', 'Tom');

INSERT INTO comments (id, blog_id, comment, author) VALUES (NULL, 1, 'Commenting first blog entry', 'Susan Norton'), (NULL, 1, 'Commenting first blog entry', 'Rose');

删除数据

DELETE FROM blogs WHERE id = 1;


因为我们定义一个简单的外键约束,并且定义了级联删除( ON DELETE CASCADE),那么上述的DELETE命令不仅会删除第一篇博客,而且与之相关的所有评论也会随之清空,并且这一过程只需一步即可搞定。

但是如果只是定义外键约束,并没有定义级联删除,则需要先删除comments表中的数据,才可以删除掉blogs表中的数据

DELETE FROM comments where blog_id=1;
DELETE FROM blogs WHERE id = 1;


扩展外键约束的用途

  现在是介绍在父表数据删除时如何对子表中的有关数据进行级联更新和删除的时候了,这能够有效简化处理这些表的应用程序的逻辑实现。

  为了帮您更好地理解InnoDB存储引擎提供的这一特性,我们将通过示例加以说明。现在,我们重新定义之前见过的那两个表,并规定特定博客被更新和删除时,要对表comments执行相应的级联动作。下面给出两表的定义:

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与前面的相同,我们只需注意一下第二个表就行了。本例中,表comments的字段保持不变,不同之处在于,这次它包含了如下所示的SQL语句:

CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`blog_id`) REFERENCES `blogs` (`id`) ON DELETE CASCADE  ON UPDATE CASCADE

当然,这是负责博客更新和删除时,对其有关的评论进行级联更新和删除的。

  我们已经给外键blog_id指定了约束,现在上述的两个表之间的关系的完整性就可以完全在数据库级别来处理了,当然,在一些应用程序的性能方面可能会有些损失。下面我们将介绍如何轻松完成此项任务。

前面,我们已经定义了两个IndoDB表,并将其作为博客应用程序的构造块。现在,我们要做的是,每当有博客更新和删除时,同时更新和删除博客对应的所有评论。

  我们将通过具体的代码加以演示。 因此,假设存储在blogs表中的唯一的博客数据需要更新,那么有关评论也得同时更新,这时我们可以通过一个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

  您可能猜到了,对第一个博客数据项的更新将自动地引起与该博客有关的评论的更新。现在,让我们利用如下所示的SQL查询来删除博客:

DELETE FROM blogs WHERE id = 2

在本文中,我们为向读者详细介绍了如何在更新和删除父表数据的同时,触发有关子表数据的级联更新和删除操作。如您所见,当使用InnoDB表的时候,借助于外键约束就可以轻松搞定这一过程。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值