MySQL 数据库基础(2)约束、用户权限、远程连接、外键与 TCP/UDP 理解

前言

上一篇学习了 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 理解(数据库底层网络))

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. 外键优缺点

✅优点:数据库层面强制数据完整性,不会出现脏数据,多表关系严谨。 ❌缺点:

  1. 降低插入、删除、更新性能,每次操作要校验关联表;
  2. 开发中很多项目会放弃数据库外键,把关联逻辑交给程序代码处理;
  3. 使用外键引擎必须是 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 个条件,缺一不可:

  1. 修改 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

  2. 数据库用户允许远程访问 用户 host 设置为%create user 'xxx'@'%' ...

  3. 云服务器安全组 / 防火墙放行 3306 端口 阿里云、腾讯云,控制台安全组入方向开放 3306 端口,否则外网访问被拦截。

远程连接命令示例:

复制代码
mysql -ulsf -h公网IP -p123 -P3306
  • -h 指定数据库 IP;-P大写,指定端口号。

五、TCP 与 UDP 理解(数据库底层网络)

MySQL 是基于TCP 协议通信,这里对比理解 TCP、UDP:

TCP(传输控制协议)

  1. 面向连接:通信前必须三次握手建立连接,通信结束四次挥手断开;
  2. 可靠传输:有确认应答、重传机制,保证数据完整、有序到达,不会丢包;
  3. 有流量控制、拥塞控制;
  4. 缺点:开销大,速度慢。

MySQL、HTTP、HTTPS 都是 TCP。MySQL 客户端和服务端之间所有 SQL 语句、查询结果,全部走 TCP。

UDP(用户数据报协议)

  1. 无连接:不需要建立连接,直接发数据包;
  2. 不可靠:没有确认,丢包不会重传,数据可能乱序;
  3. 开销极小,速度快;

使用场景:直播、语音通话、游戏,允许少量丢包,追求速度。

为什么 MySQL 选用 TCP?

数据库传输的是 SQL 语句、查询结果,绝对不能丢包,不能错乱。如果丢一条 update 语句,会造成数据库数据错乱,所以必须用可靠的 TCP 协议,UDP 不适合数据库。

简单记: TCP:打电话,先接通再说话,消息稳,慢。 UDP:发短信,直接发,不确认对方收到,速度快,可能丢消息。

六、小结

  1. 各类约束保证数据完整性,外键是表与表的关联,核心是级联操作;实际开发经常业务层代替数据库外键。
  2. MySQL 远程连接三件套:改 bind‑address、用户 host=%、云服务器放行 3306 安全组。
  3. MySQL 通信底层是 TCP,TCP 重可靠,UDP 重速度;数据库业务场景优先选择可靠的 TCP。
相关推荐
丰锋ff44 分钟前
基于C++11的数据库连接池
数据库
人工干智能1 小时前
科普:pandas 时间偏移别名:ts.resample(“5Min“).sum()
python·pandas
TDengine (老段)1 小时前
TDengine 应用案例 — 工业大数据与智能制造
大数据·数据库·制造·时序数据库·tdengine·涛思数据
狂热开发者1 小时前
打印机卖到欧洲以后 App 更新了,旧包装二维码还能用吗
数据库
开源量化GO1 小时前
最新AI辅助量化表达:先理清规则,再按需求选工具
人工智能·python
Zane19941 小时前
为什么 del 一个对象有时立刻消失,有时却纹丝不动?一文讲透引用计数与垃圾回收
后端·python
CedarQR1 小时前
云卓 G20 遥控器 Android 开发实录:从 USB 设备到读取摇杆/按键通道值
android·linux·无人机
lxw20230271161 小时前
k8s的pod管理
linux·容器·kubernetes
yichudu1 小时前
Python 装饰器 decorator
开发语言·python