数据表之间关联关系和关联查询
由 学院君 创建于5个月前, 最后更新于 5个月前
版本号 #3
961 views
0 likes
0 collects
关联关系简介
MySQL 之所以被称之为关系型数据库,是因为可以基于外键定义数据表之间的关联关系,日常开发常见的关联关系如下所示:
一对一:一张表的一条记录对应另一张表的一条记录,比如用户表与用户资料表
一对多:一张表的一条记录对应另一张表的多条记录,比如用户表与文章表、文章表与评论表
多对一:一张表的多条记录归属另一张表的一条记录(一对多的逆向操作)
多对多:一张表的多条记录归属另一张表的多条记录,此时仅仅基于两张表的字段已经无法定义这种关联关系,需要借助中间表来定义,比如文章表与标签表往往是这种关联
我们在上篇教程已经介绍了 Go 语言中基于第三方包 go-sql-driver/mysql 对单个数据表的增删改查操作,接下来我们来看看如何基于这个包对关联表进行操作。
新建评论表
为了方便演示,我们在 test_db 数据库中新建一张评论表 comments:
CREATE TABLE `comments` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`content` text COLLATE utf8mb4_unicode_ci,
`author` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`post_id` bigint unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY fk_post_id(`post_id`) REFERENCES posts(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这里我们创建了一个外键将 comments 表的 post_id 字段和 posts 表的 id 字段关联起来,并且通过 ON DELETE CASCADE 声明将两张表级联起来:当删除 posts 表中的某条记录时,自动删除 comments 中与之关联的评论记录(如果省略这个声明,则不能直接删除 posts 表中有 comments 关联依赖的记录)。
我们在 posts 和 comments 插入两条记录,这两条记录通过 comments.post_id 建立了外键关联: