前言
上一篇学习了 MySQL 基础的库、表、增删改查,本篇重点讲解表约束、外键、用户管理、远程连接,同时梳理网络层 TCP 与 UDP 的核心区别,理解数据库通信底层网络逻辑。
目录
[一、MySQL 表约束](#一、MySQL 表约束)
[二、外键(foreign key)重点](#二、外键(foreign key)重点)
[1. 创建表的时候直接定义外键](#1. 创建表的时候直接定义外键)
[2. 给已经存在的表添加外键](#2. 给已经存在的表添加外键)
[3. 删除外键](#3. 删除外键)
[4. 外键优缺点](#4. 外键优缺点)
[三、MySQL 用户管理](#三、MySQL 用户管理)
[1. 创建用户](#1. 创建用户)
[2. 授权](#2. 授权)
[四、MySQL 远程连接(Linux 环境)](#四、MySQL 远程连接(Linux 环境))
[五、TCP 与 UDP 理解(数据库底层网络)](#五、TCP 与 UDP 理解(数据库底层网络))
[为什么 MySQL 选用 TCP?](#为什么 MySQL 选用 TCP?)
一、MySQL 表约束
约束作用:给表的字段增加规则,保障存入数据库的数据合法、完整、正确。
表格
| 约束 | 关键字 | 作用说明 |
|---|---|---|
| 主键约束 | primary key |
唯一确定一行数据,非空且不重复;支持组合主键,多个字段联合作为主键 |
| 非空约束 | not null |
字段值不能为 NULL |
| 默认值 | default |
插入数据不给该字段赋值时,自动填入预设值,例default '男' |
| 唯一约束 | unique |
字段不能出现重复值,可以为 NULL |
| 自增长 | auto_increment |
整数类型专用,维护最大值,插入时自动 + 1,一般配合主键使用 |
| 检查约束 | check() |
限制字段取值范围,例check(age>0),MySQL8.0 完整支持 |
| 外键约束 | foreign key |
维护多张表之间的关联关系,保证引用数据完整性 |
二、外键(foreign key)重点
核心:外键用来维护表与表之间的关联关系,保证引用完整性。 A 表的外键字段,引用 B 表的主键,A 表叫子表,B 表叫父表。 规则:子表外键的值,要么是父表主键真实存在的值,要么为 NULL,不能随便写不存在的数据。
1. 创建表的时候直接定义外键
create table order(
id int primary key auto_increment,
user_id int,
constraint fk_order_user foreign key(user_id) references user(id)
on delete cascade
on update cascade
);
constraint fk_order_user:给外键起名字,方便后续删除foreign key(user_id):当前表的外键字段references user(id):引用 user 表的 id 主键on delete cascade:级联删除:父表 user 删除一条记录,子表 order 关联的数据跟着一起删除on update cascade:级联更新:父表主键更新,子表外键同步更新
2. 给已经存在的表添加外键
alter table `order`
add constraint fk_order_user
foreign key(user_id) references user(id)
on delete cascade on update cascade;
3. 删除外键
⚠️注意:删除外键必须使用外键的约束名,不能写字段名 ,可以用
show create table 表名;查询外键名字
alter table `order` drop foreign key fk_order_user;
4. 外键优缺点
✅优点:数据库层面强制数据完整性,不会出现脏数据,多表关系严谨。 ❌缺点:
- 降低插入、删除、更新性能,每次操作要校验关联表;
- 开发中很多项目会放弃数据库外键,把关联逻辑交给程序代码处理;
- 使用外键引擎必须是 InnoDB,MyISAM 不支持外键。
补充级联其他取值:
on delete set null:父表删除,子表外键置为 null;on delete restrict(默认):父表有子表关联数据,禁止删除父表数据,也就是我们之前遇到的 1452 报错。
三、MySQL 用户管理
1. 创建用户
-- 只允许本机登录
create user 'lsf'@'localhost' identified by '123';
-- % 代表任意主机,可以远程登录
create user 'lsf'@'%' identified by '123';
'用户名'@'主机':主机指定这个用户可以从哪个地址登录,localhost本机,%所有地址。
2. 授权
-- 授予全部权限
grant all privileges on *.* to 'lsf'@'%';
-- 刷新权限,生效
flush privileges;
四、MySQL 远程连接(Linux 环境)
想要外部电脑连接服务器上的 MySQL,需要同时满足 3 个条件,缺一不可:
-
修改 MySQL 配置文件 文件路径:
/etc/mysql/mysql.conf.d/mysqld.cnf修改bind-address = 0.0.0.0,代表监听所有网卡地址,不再只监听本机 127.0.0.1。 修改完成重启 mysql 服务:systemctl restart mysql
或者
service mysql restart
-
数据库用户允许远程访问 用户 host 设置为
%,create user 'xxx'@'%' ...。 -
云服务器安全组 / 防火墙放行 3306 端口 阿里云、腾讯云,控制台安全组入方向开放 3306 端口,否则外网访问被拦截。
远程连接命令示例:
mysql -ulsf -h公网IP -p123 -P3306
-h指定数据库 IP;-P大写,指定端口号。
五、TCP 与 UDP 理解(数据库底层网络)
MySQL 是基于TCP 协议通信,这里对比理解 TCP、UDP:
TCP(传输控制协议)
- 面向连接:通信前必须三次握手建立连接,通信结束四次挥手断开;
- 可靠传输:有确认应答、重传机制,保证数据完整、有序到达,不会丢包;
- 有流量控制、拥塞控制;
- 缺点:开销大,速度慢。
MySQL、HTTP、HTTPS 都是 TCP。MySQL 客户端和服务端之间所有 SQL 语句、查询结果,全部走 TCP。
UDP(用户数据报协议)
- 无连接:不需要建立连接,直接发数据包;
- 不可靠:没有确认,丢包不会重传,数据可能乱序;
- 开销极小,速度快;
使用场景:直播、语音通话、游戏,允许少量丢包,追求速度。
为什么 MySQL 选用 TCP?
数据库传输的是 SQL 语句、查询结果,绝对不能丢包,不能错乱。如果丢一条 update 语句,会造成数据库数据错乱,所以必须用可靠的 TCP 协议,UDP 不适合数据库。
简单记: TCP:打电话,先接通再说话,消息稳,慢。 UDP:发短信,直接发,不确认对方收到,速度快,可能丢消息。
六、小结
- 各类约束保证数据完整性,外键是表与表的关联,核心是级联操作;实际开发经常业务层代替数据库外键。
- MySQL 远程连接三件套:改 bind‑address、用户 host=%、云服务器放行 3306 安全组。
- MySQL 通信底层是 TCP,TCP 重可靠,UDP 重速度;数据库业务场景优先选择可靠的 TCP。