MySQL 入门:库、表、行、主键是什么
个人主页会编程的土豆欢迎来访作者简介后端学习者❄️个人专栏数据结构与算法数据库leetcode✨那些你一个人走过的夜路终将化作照亮未来的光系列《影院票务 GO》知识点博客 · 第 6 篇对应文件sql/schema.sql、sql/seed.sql以及config/config.go里的 DSN写在前面票务系统所有「记得住」的东西——用户账号、电影、场次、座位状态、订单——最后都落在MySQL里。Go 程序重启后内存 Session 会丢数据库里的订单还在。学长可能问「库和表啥区别为什么每张表都有 idDECIMAL 和 FLOAT 有啥不一样」本篇用最直白的方式建立数据库世界观并对照本项目的ttms库。不涉及复杂 SQL 语法细节那是第 7 篇先把名词和表结构讲透能和models/models.go对上号。1. 四级概念从服务器到单元格MySQL 服务器进程默认端口 3306 └── 数据库 Database如 ttms └── 表 Table如 users、movies、orders └── 行 Row一条用户、一笔订单 └── 列 Columnusername、amount、status…概念类比项目例子服务器整栋图书馆大楼你电脑上的 MySQL 8 服务数据库一个分馆 / 一个项目专属书架区ttms表一种登记册users、seats、orders行登记册里的一行用户admin那一行列登记项username、password、role脚本开头schema.sqlDROP DATABASE IF EXISTS ttms; CREATE DATABASE ttms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE ttms;含义若已有ttms库则删掉开发脚本危险操作生产绝不用创建新库指定字符集USE ttms进入该库后面CREATE TABLE都建在这里和 Go 的衔接config.Load()默认 DSN 末尾是/ttms?charsetutf8mb4...——连的就是这个库名。2. 为什么需要数据库不用文件行吗可以把订单写进orders.txt。小 demo 可以票务系统不行因为数据库擅长能力文件方案的痛点结构化查询找「某用户所有待支付订单」要扫全文并发安全两人同时买同一座文件很难原子更新约束用户名重复、外键引用靠自觉持久与恢复文件也能持久但缺少事务、备份生态索引按时间查场次表上有INDEX课程项目必须用 MySQL也是为了练事务、行锁、外键——后面第 16、17 篇的主线。3. 本项目表关系鸟瞰schema.sql建的表简化关系users ─────┬──── orders ──── schedules ──── movies │ │ │ └── halls ├── comments ──── movies ├── ratings ──── movies │ movie_groups ── movies schedules ── seats每场次一批座位表存什么users登录账号、角色movie_groups动作/科幻等分类movies电影元数据、评分汇总halls影厅名、行列数schedules哪部电影、哪个厅、几点、票价seats某场次下每个格子的状态orders订单号、座位摘要、金额、支付截止comments评论与回复parent_idratings用户对电影 1–10 分Go 里models包与这些表一一对应第 5 篇。4. 主键 PRIMARY KEY几乎每张表都有id BIGINT PRIMARY KEY AUTO_INCREMENT概念含义主键唯一标识一行不能重复、不能 NULL惯例AUTO_INCREMENT插入时不写 idMySQL 自动分配 1, 2, 3…BIGINT64 位整数id 空间大为什么几乎都用 surrogate key代理主键id关联方便orders.user_id→users.id业务字段会变昵称可改username 理论上也可改id 稳定Join 性能整数比长字符串做主键更常见拓展自然键用username或order_no当主键理论上可以但order_no在本项目仍是UNIQUE 业务键主键仍是id——两套并存见思考题。5. 常见列类型对照 schema5.1 字符串username VARCHAR(50) NOT NULL UNIQUE password CHAR(32) NOT NULL description TEXT seat_info VARCHAR(255)类型特点项目用途VARCHAR(n)可变长最多 n 字符用户名、标题CHAR(n)定长不足补空格存比较时MD5 十六进制固定 32 位TEXT长文本电影简介5.2 数值role TINYINT NOT NULL DEFAULT 0 duration INT NOT NULL DEFAULT 120 amount DECIMAL(10,2) NOT NULL DEFAULT 0 rating_avg DECIMAL(3,1) NOT NULL DEFAULT 0.0类型用途TINYINT小整数、枚举状态0/1/2INT时长分钟、计数DECIMAL(p,s)精确小数金额、评分钱为什么用 DECIMAL 不用 FLOATFLOAT/DOUBLE 是二进制浮点0.1 0.2在计算机里不精确票价 45.00、订单 90.00 必须精确到分GoScan进float64对课程够用金融系统常用整数「分」或 decimal 库rating_avg DECIMAL(3,1)最多 3 位数字、1 位小数如 9.3、10.0思考题最大值5.3 时间created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP start_time DATETIME NOT NULL pay_deadline DATETIME NOT NULL paid_at DATETIME NULLGo DSN 里parseTimetruelocLocal才能把 DATETIME 扫进time.Time。6. 约束数据库帮你守门username VARCHAR(50) NOT NULL UNIQUE约束含义NOT NULL不能空UNIQUE不能重复DEFAULT缺省值PRIMARY KEY主键唯一FOREIGN KEY引用父表必须存在例订单表CONSTRAINT fk_order_user FOREIGN KEY (user_id) REFERENCES users(id), CONSTRAINT fk_order_sch FOREIGN KEY (schedule_id) REFERENCES schedules(id),插入user_id99999若 users 里没有 →拒绝防止孤儿订单。座位表UNIQUE KEY uk_seat (schedule_id, row_no, col_no),同一场次同一排座不能重复两行——防数据脏。应用层也要校验但约束是最后一道防线。7. 索引 INDEX入门INDEX idx_sch_start (start_time), INDEX idx_order_user (user_id), INDEX idx_seat_lock (status, lock_until),索引像「书的目录」按用户查订单、按时间查场次、清理任务扫超时锁座不必全表扫描。代价插入/update 要维护索引小项目数据量小感觉不明显大数据量关键。8. 引擎 InnoDB) ENGINEInnoDB;每张表末尾都有。引擎特点InnoDB事务、行级锁、外键——购票必备MyISAM老无事务不适合订单锁座本项目全部 InnoDB。CreateOrderWithSeats里BEGINFOR UPDATE依赖 InnoDB 行锁第 17 篇。9. 字符集 utf8mb4DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci名称说明utf8mb4完整 UTF-8含中文、emoji4 字节utf8MySQL 旧名最多 3 字节不完整电影名、评论、昵称可能有 emojiDSN 也要charsetutf8mb4。乱码排查客户端编码、表字符集、连接 charset 三者一致。10. schema vs seed文件作用本项目特点schema.sql建库建表结构开头DROP DATABASE会清空整个库seed.sql插入演示数据内容默认账号、电影、场次典型开发流程1. 改表结构 → 编辑 schema.sql → 在 MySQL 里执行 2. 需要演示数据 → 执行 seed.sql依赖 schema 已建好 3. 启动 Go → db.Init Ping ttms 成功db.Init失败时的提示连接 MySQL 失败: ...请先执行 sql/schema.sql 和 sql/seed.sql说明库不存在、表不存在、MySQL 没启动都会 Ping 失败。10.1 seed 里有什么管理员admin/admin123、顾客user/user123密码 MD5盐第 13 篇讲5 部电影、3 个影厅、若干未来场次执行 seed 后才有首页列表可点11. 单表精读usersCREATE TABLE IF NOT EXISTS users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password CHAR(32) NOT NULL COMMENT MD5(passwordsalt), salt VARCHAR(16) NOT NULL, nickname VARCHAR(50) NOT NULL DEFAULT , phone VARCHAR(20) NOT NULL DEFAULT , role TINYINT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB;列对应 models.UseridID int64usernameUsernamepasswordPasswordjson:“-”role 0/1RoleCustomer / RoleAdmin12. 单表精读seats 与 ordersseats——购票并发核心status TINYINT NOT NULL DEFAULT 0, -- 0空闲 1锁定 2已售 lock_user_id BIGINT NULL, lock_until DATETIME NULL, order_id BIGINT NULL,和models.Seat、SeatFree/Locked/Sold常量一致。ordersorder_no VARCHAR(32) NOT NULL UNIQUE, seat_info VARCHAR(255) NOT NULL DEFAULT , amount DECIMAL(10,2) NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 0, pay_deadline DATETIME NOT NULL,order_no业务可见id内部关联 seats.order_id。13. 和 Go 的三层连接预告后续篇Go 应用 database/sql标准库接口 go-sql-driver/mysql驱动db 包 _ 导入 MySQL 服务器 :3306 数据库 ttms组件文件DSN 字符串config/config.gosql.OpenPingdb/db.go执行 SQLdao/*.go行 → structScan进models.*本篇不讲SELECT/INSERT语法细节——那是07 · SQL 增删改查。本篇不讲连接池参数——那是08 · database/sql。14. 拓展客户端怎么执行脚本方式任选mysql -u root -p sql/schema.sql mysql -u root -p sql/seed.sql或在 Navicat / DBeaver / MySQL Workbench 里打开文件执行。执行前确认连的是开发机不是生产。15. 常见误区「数据库 MySQL 软件」常混MySQL 是服务器软件ttms是它里面的一个 database。「没有 schema 也能 go run」db.InitPing 会失败main Fatal 退出。「FLOAT 存票价省空间」省那点空间不值得丢精度。「DROP DATABASE 和 DELETE 一样」DROP 整个库没了DELETE 删行。schema 开头 DROP 是重置开发环境。「3306 和 8080 是一个服务」MySQL 3306Go HTTP 8080。浏览器访问 3306 不对第 1 篇思考题。16. 项目代码对照概念位置建库建表sql/schema.sql演示数据sql/seed.sql连接串config/config.go→TTMS_DSN环境变量连接池db/db.go→Init表 → structmodels/models.go读写行dao/user.go,dao/order.go, …启动检查清单□ MySQL 服务已启动 □ 已执行 schema.sql有 ttms 库和表 □ 已执行 seed.sql有 admin/user 和电影 □ config DSN 用户名密码与本地 MySQL 一致 □ go run . 看到「MySQL 连接成功」和 8080 启动日志17. 小结口述稿MySQL 用库、表、行、列组织数据我们项目库名是 ttms。主键 id 自增用来稳定关联业务号 order_no 另设 UNIQUE。金额用 DECIMAL状态用 TINYINT和 Go 常量数值对应。InnoDB 支持事务和行锁utf8mb4 支持中文和 emoji。schema 管结构会 DROP 重建seed 管演示数据Go 通过 DSN 连 ttms。18. 思考题为什么orders.order_no也 UNIQUE同时还要有id主键rating_avg DECIMAL(3,1)最大能表示多少最小呢若把座位status存成字符串locked而不是 0/1/2在 SQL 和 Go 里各有什么优缺点DROP DATABASE IF EXISTS ttms的危险是什么生产环境能随便跑 schema 吗DSN 里parseTimetrue若去掉Go 里 Scan 到time.Time会怎样19. 下一篇预告《07 · SQL 增删改查与 dao 对应》——SELECT/INSERT/UPDATE/DELETE 在本项目里的真实写法以及QueryRow、Query、Exec和Scan怎么配合

相关新闻

WGAN-GP在光伏发电突变预测中的应用与实践

WGAN-GP在光伏发电突变预测中的应用与实践

1. 项目背景与核心价值光伏发电领域一直面临一个关键挑战:如何准确预测"魔法时刻"——那些光照条件突然变化导致发电量陡增或骤降的特殊时段。传统基于历史数据的统计方法往往难以捕捉这些非线性突变,而生成对抗网络(GAN)为我们提供了新的可能…

2026/9/23 22:44:09 阅读更多 →
概率思维与贝叶斯方法在AI中的应用

概率思维与贝叶斯方法在AI中的应用

1. 概率思维:AI应对不确定世界的底层逻辑在现实世界中,我们每天都要面对各种不确定性——天气预报说"70%概率下雨"该不该带伞?医生根据检查结果告诉你"90%可能是良性肿瘤"要不要手术?这些判断背后&#xff0c…

2026/9/23 23:22:12 阅读更多 →
Adobe国际认证培训课程  备考  题型

Adobe国际认证培训课程 备考 题型

✅近期很多备考Adobe认证的家人们会问培训课程有多长时间,自己好安排时间学习,今天就给大家总结了一下 🥇PS专家认证:课程总时长约20h ❶1—81节:基础入门课 ❷87—88节:考前须知 ❸89—92节:理…

2026/9/23 5:13:03 阅读更多 →

最新新闻

基于Python的舆情热点分析平台:从网易新闻爬虫到情感可视化

基于Python的舆情热点分析平台:从网易新闻爬虫到情感可视化

简介:面向Python课程设计与毕业设计的一站式舆情热点分析平台源码,完整覆盖从网易新闻及评论抓取、数据清洗、中文分词、停用词过滤、情感分析、关键词提取到时间序列分析与可视化展示的典型数据科学流程。资源共1403个文件,约23.83MB&#x…

2026/9/24 0:49:52 阅读更多 →
AI Skill 商业化指南:从能力单元到稳定收入的完整路径

AI Skill 商业化指南:从能力单元到稳定收入的完整路径

1. 先搞清楚你手里的 Skill 到底是什么货1.1 Skill 不是“提示词合集”,别把它想小了很多人第一次接触 Skill 这个概念,会下意识觉得“不就是把一段提示词打包一下吗”。这个理解不能说全错,但确实把 Skill 想得太窄了。我见过太多人拿着一个…

2026/9/24 0:49:52 阅读更多 →
YOLO舰船目标检测实战:数据转换、训练调参与部署避坑指南

YOLO舰船目标检测实战:数据转换、训练调参与部署避坑指南

简介:这份资源面向深度学习与计算机视觉方向的学习者和研究者,提供一套基于YOLO算法的舰船目标检测完整实现方案,可用于海上救援、军事侦察、交通控制等场景下的船只自动识别研究。资源包共60个文件,包含55张jpg舰船图像、2个mat数…

2026/9/24 0:49:52 阅读更多 →
C# OnnxRuntime部署DAMO-YOLO人头检测实战指南

C# OnnxRuntime部署DAMO-YOLO人头检测实战指南

简介:本资源是一套面向C#开发者与计算机视觉初学者的DAMO-YOLO人头检测实战部署方案,聚焦安防、人群密度分析等实际场景,解决传统YOLO模型在C#环境难以直接调用的工程落地难题。压缩包共500个文件,含111个运行依赖DLL、4个ONNX模型…

2026/9/24 0:49:52 阅读更多 →
ECG心电信号分类实战:Python与Matlab双版本实现与避坑指南

ECG心电信号分类实战:Python与Matlab双版本实现与避坑指南

简介:这是一份面向医学数据分析、生物医学工程及机器学习初学者的ECG心电信号分类资源包,整合Python与MATLAB两套实现方案,帮助学习者掌握从信号预处理、特征提取到分类建模的完整流程。压缩包共825个文件,约6.25MB,核…

2026/9/24 0:46:51 阅读更多 →
YOLOv7打电话检测实战:双格式数据集与训练部署全解析

YOLOv7打电话检测实战:双格式数据集与训练部署全解析

简介:YOLOv7打电话行为检测项目,面向计算机视觉开发者与边缘设备部署场景,适合需要快速落地手持电话识别功能的工程人员及高校研究者。压缩包提供训练好的权重、完整训练代码以及配套数据集,可直接加载权重进行图片/视频推理&…

2026/9/24 0:46:51 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →