这是我参与「第三届青训营 -后端场」笔记创作活动的的第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图
可以看到我们的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字段