Mysql主键与外键使用细节 | 青训营笔记

164 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

主键使用的细节讨论

primary key 不能重复而且不能为 null。

一张表最多只能有一个主键, 但可以是复合主键(比如 id+name)

(id INT PRIMARY KEY, -- 表示 id 列是主键

`name` VARCHAR(32), PRIMARY KEY -- 错误的

email VARCHAR(32));

演示复合主键 (id 和 name 做成复合主键)

(id INT ,

`name` VARCHAR(32),

email VARCHAR(32),

PRIMARY KEY (id, `name`) -- 这里就是复合主键

)

id 和 name 不能同时重复且不能同时为空

主键的指定方式 有两种

1. 直接在字段名后指定:字段名 primakry key

2. 在表定义最后写 primary key(列名);

第一种:

(id INT ,

`name` VARCHAR(32) PRIMARY KEY,

email VARCHAR(32)

);

第二种:

(id INT ,

`name` VARCHAR(32) ,

email VARCHAR(32),

PRIMARY KEY(`name`) -- 在表定义最后写 primary key(列名)

使用 desc 表名,可以看到 primary key 的情况

外键使用的细节讨论

本次项目中用到了多次外键 ,我是负责数据库部分的,因此在建表方面下了点功夫

抖音项目ER图

image.png 可以看到我们的ER图中有多处用到了外键约束主从表关系 下面以user表和video表为例进行说明

User表:

CREATE TABLE `user` ( 
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户昵称', 
`password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
`follow_count` int NOT NULL COMMENT '关注数量', 
`follower_count` bigint(20) NOT NULL COMMENT '粉丝数量', 
`create_time` datetime default CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间', 
`update_time` datetime default CURRENT_TIMESTAMP NOT NULL COMMENT '修改时间', 
`is_deleted` tinyint default 0 NOT NULL COMMENT '逻辑删除',
PRIMARY KEY (`id`) )
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户表';

Vide表:

CREATE TABLE `video` ( 
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`uid` bigint(20) unsigned NOT NULL COMMENT '视频发布者id',
`play_url` text NOT NULL COMMENT '视频文件路径',
`cover_url` text NOT NULL COMMENT '视频封面路径', 
`comment_count` bigint(20) NOT NULL COMMENT '评论数量',
`favourite_count` bigint(20) NOT NULL COMMENT '点赞数量',
`title` varchar(255) NOT NULL COMMENT '视频标题',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '发布时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '修改时间',
`is_deleted` tinyint DEFAULT 0 NOT NULL COMMENT '逻辑删除',
PRIMARY KEY (`id`),
constraint video_user_uid_fk 
foreign key (uid) references user (id) )
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='视频表';

1.外键☞的表的字段必须唯一,也就是必须为主键primary key 或者是unique

如作为外键的video表中的uid字段指向的是user表中的id字段

2.表的类型必须是innodb ,否则不支持外键

image.png

3.外键的字段必须和主键字段类型一致(长度可以不同)

4.外键字段的值必须在主键字段中出现过,或者为null(前提是外键字段允许为null

5.一旦指定主外键关系,数据就不能随意删除了。