首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >什么是关系型数据库?用 MySQL 动手验证:建表、外键、事务与 ACID 全流程

什么是关系型数据库?用 MySQL 动手验证:建表、外键、事务与 ACID 全流程

原创
作者头像
李白客
修改2026-09-10 15:59:31
修改2026-09-10 15:59:31
240
举报

一句话定义:关系型数据库,就是用二维表组织数据、表与表之间用外键建立关联、用 SQL 统一操作、靠事务保证一致性的数据库。

定义看完就忘,动手做一遍才记得住。这篇文章你跟着敲完,能带走三样东西:一个跑通的关系模型示例、一套验证 ACID 的 SQL、以及「什么时候该用关系型、什么时候不该用」的判断力。最后再补上云上落地要点和避坑清单,把「内容」补完整。

准备:两种环境任选其一

方式一:本地 MySQL。 装好 MySQL 8.0,命令行执行:

代码语言:bash
复制
mysql -u root -p

方式二:云数据库 MySQL。 控制台 5 分钟开通:创建实例 → 配置白名单 → 创建账号和库 → 连接。云数据库把安装、主备、备份都托管了,适合不想碰运维的开发者。

无论哪种,先建一个库,统一用 utf8mb4 字符集(避免中文乱码):

代码语言:sql
复制
CREATE DATABASE demo_db CHARACTER SET utf8mb4;
USE demo_db;

一、建表:理解表、行、列、主键

关系型数据库的「表」,可以理解成加强版的 Excel 工作表:行是记录,列是字段。

先建一张用户表:

代码语言:sql
复制
CREATE TABLE users (
  user_id   INT PRIMARY KEY,      -- 主键:唯一标识一行
  name      VARCHAR(50),
  phone     VARCHAR(20),
  created_at DATE
);

插入两条数据:

代码语言:sql
复制
INSERT INTO users VALUES
  (1001, '张三', '13800000000', '2026-01-01'),
  (1002, '李四', '13900000000', '2026-01-02');

查一下,确认数据进去了:

代码语言:sql
复制
SELECT * FROM users;

user_id

name

phone

created_at

1001

张三

13800000000

2026-01-01

1002

李四

13900000000

2026-01-02

user_id主键:一张表里唯一标识一行记录,不能重复、不能为空。你现在试着再插一条 user_id = 1001 的记录,MySQL 会直接报错拒绝——这就是主键在兜底。

二、加外键:理解「关系」是怎么建立的

「关系型」三个字里的「关系」,说的不是人际关系,而是表和表之间通过字段建立的关联。这个关联靠外键实现。

建一张订单表,用 user_id 关联回用户表:

代码语言:sql
复制
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  user_id  INT,
  amount   DECIMAL(10,2),
  FOREIGN KEY (user_id) REFERENCES users(user_id)  -- 外键:引用 users 表的主键
);

INSERT INTO orders VALUES (9001, 1001, 299.00);

现在插入一条 user_id = 9999(用户表里不存在)的订单,看看会发生什么:

代码语言:sql
复制
INSERT INTO orders VALUES (9002, 9999, 100.00);
-- ERROR 1452: Cannot add or update a child row: a foreign key constraint fails

报错了。外键在数据库层面保证「订单必须属于一个真实存在的用户」,这就是数据完整性。

用 JOIN 把两张表拼起来查:

代码语言:sql
复制
SELECT o.order_id, u.name, o.amount
FROM orders o
JOIN users u ON o.user_id = u.user_id;

order_id

name

amount

9001

张三

299.00

订单里只存了一个 user_id,用户姓名是从 users 表现查的——数据不重复存储,靠关联拼出完整信息,这就是关系模型的核心。

三、跑一个事务:验证 ACID

关系型数据库最值钱的能力,是保证「一组操作要么全成、要么全败」,靠的是事务和 ACID。

建一张账户表:

代码语言:sql
复制
CREATE TABLE accounts (
  account_id VARCHAR(20) PRIMARY KEY,
  balance    DECIMAL(10,2)
);
INSERT INTO accounts VALUES ('A', 1000), ('B', 1000);

验证原子性 + 一致性:A 转 100 给 B,这是两个 UPDATE,必须绑成一个事务:

代码语言:sql
复制
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';
COMMIT;

提交后查一下:

代码语言:sql
复制
SELECT * FROM accounts;

account_id

balance

A

900

B

1100

总额还是 2000,不多不少——这就是原子性(两步一起成)和一致性(总额守恒)。

验证回滚:故意让第二步失败,看会不会「只做一半」:

代码语言:sql
复制
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE account_id = '不存在的账户';
ROLLBACK;

回滚后 A 的余额回到 900(而不是 800),说明第一笔扣款被撤销了,没有出现「扣了没加」的中间状态。持久性则保证 COMMIT 之后的数据断电也不丢;隔离性让并发的事务互不干扰(对应读未提交 / 读已提交 / 可重复读 / 串行化四个隔离级别)。

四、选型:关系型 vs 非关系型怎么选

理解了关系型数据库,再把它和非关系型(NoSQL)放一起看,选型就不纠结了:

维度

关系型数据库

非关系型数据库

数据模型

二维表(结构化)

文档 / 键值 / 列 / 图(灵活)

表结构

先定义好 schema

动态可变

查询

统一 SQL

各自 API

一致性

强一致(ACID)

大多最终一致

扩展

垂直扩展为主

水平扩展为主

代表

MySQL、PostgreSQL、Oracle

MongoDB、Redis、Cassandra

一句话判断:要强一致、多表关联、事务复杂(钱、账、订单),选关系型;要海量高并发、结构灵活、快速扩展(缓存、日志、推荐),选非关系型。 多数真实系统是两者一起用。

五、云上落地:云数据库 MySQL 实操要点与云原生演进

上面的实验,自建和云数据库都能跑。两者的区别在于运维谁扛:

对比项

云数据库 MySQL

自建 MySQL

部署

控制台几分钟开通

手动安装配置

高可用

主备自动切换

自己搭主从 / MHA

备份

自动物理备份、任意时间点恢复

自己写脚本

扩容

控制台升配 / 加只读实例

自己规划

成本

月费(含运维)

硬件 + 人力

落地实操注意三点

  1. 白名单:云数据库默认拒绝外部访问,先把自己服务器的 IP 加进白名单,否则连不上。
  2. 字符集:建库务必用 utf8mb4,否则中文乱码、emoji 存不进去。
  3. 备份与高可用:核心业务选高可用版,并开启自动备份——云上「删库跑路」的惨案,几乎都是没配备份。

再往云原生看,数据库正在发生一次形态演进:存算分离(计算和存储独立伸缩)、Serverless(按用量计费、自动启停)、HTAP(事务和分析一套库搞定)。选云数据库时,如果你的业务量波动大,Serverless 形态能省不少成本;如果既要交易又要实时分析,可以关注 HTAP 能力。

六、避坑清单

把上面散落的坑汇总成一张清单,落地时逐条过:

  1. 白名单没配就怪连不上:先检查安全组 / 白名单。
  2. 字符集用默认 latin1:中文必乱码,建库用 utf8mb4。
  3. 外键没建:数据完整性只靠应用层「自觉」,迟早出现脏数据。
  4. 长事务不拆:事务越短越好,长事务是死锁和连接占用的温床。
  5. 没配备份就上生产:高可用版 + 自动备份,一条都不能少。
  6. 选型一刀切:该强一致的用了 NoSQL,或反过来,都会埋雷。

七、总结

动手验证完,关系型数据库你已经亲眼见到了三个核心:

  1. 表 + 主键:数据按行列组织,主键唯一标识一行。
  2. 外键 + JOIN:表与表通过外键建立关联,这是「关系」二字的来源。
  3. 事务 + ACID:一组操作要么全成、要么全败,这是它几十年不倒的根本。

下一步建议:把上面的 SQL 在自己的 MySQL 里完整跑一遍,再试着给 orders 插一条不存在用户的外键、故意跑一个会失败的事务,感受约束和事务的力量。跑通了,「什么是关系型数据库」这个问题就算真正过手了。

在信创、国产化替代的大背景下,「降低 MySQL 依赖」已经排进很多企业的年度计划。国产关系型数据库大多兼容 MySQL 或 Oracle 的语法,迁移时能省不少改造的力气。KingbaseES Oracle兼容版也在今年3月发布了全面升级新版本,以后可以专门写一篇,这里你只需要知道:关系型数据库不只有 MySQL 和 Oracle,国产库已经是绕不开的选项。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 准备:两种环境任选其一
  • 一、建表:理解表、行、列、主键
  • 二、加外键:理解「关系」是怎么建立的
  • 三、跑一个事务:验证 ACID
  • 四、选型:关系型 vs 非关系型怎么选
  • 五、云上落地:云数据库 MySQL 实操要点与云原生演进
  • 六、避坑清单
  • 七、总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档