第一幕:建库建表与数据增删改
2026/5/9大约 4 分钟数据库
数据库不神秘。花名册是一张表,手机通讯录也是一张表——有行有列、结构化的信息,就是数据库的"表"。
基本概念
| 术语 | 生活类比 | 例子 |
|---|---|---|
| 数据库(Database) | 一个文件柜 | "音乐平台"的所有数据 |
| 表(Table) | 文件柜里的一个抽屉 | 用户表、歌曲表、歌单表 |
| 行/记录(Row) | 抽屉里的一张卡片 | 张三的信息 |
| 列/字段(Column) | 卡片上的一个填写项 | 姓名、手机号 |
CREATE DATABASE / CREATE TABLE
-- 建库
CREATE DATABASE music_platform;
USE music_platform;
-- 建表
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
nickname VARCHAR(50) NOT NULL,
email VARCHAR(100),
age INT,
gender VARCHAR(10),
bio TEXT,
created_at DATETIME DEFAULT NOW(),
is_vip INT DEFAULT 0
);建表 = 设计一张空白表格的表头——决定有哪些列、每列填什么类型、哪些是必填项。
核心数据类型(记住这 6 种)
| 数据类型 | 存什么 | 例子 |
|---|---|---|
INT | 整数 | 年龄、播放次数 |
VARCHAR(n) | 变长文字(最多 n 字符) | 用户名(50)、歌名(200) |
TEXT | 大段文字 | 歌词、个人简介 |
DECIMAL(m,d) | 精确小数(金额) | 价格(10,2) |
DATE | 日期 | 生日:2003-05-15 |
DATETIME | 日期+时间 | 注册时间 |
VARCHAR(n) 里的 n 是字符数
在 UTF-8 编码下,VARCHAR(50) 可以存 50 个汉字或 50 个字母。VARCHAR 是变长的——用多少占多少,不会浪费空间。
铁律
手机号用 VARCHAR 不用 INT(手机号不做加减法,且可能有前导零)。金额用 DECIMAL 永远不用 FLOAT(浮点数会丢精度)。
INSERT —— 插入数据
-- 单条
INSERT INTO users (nickname, email, age, gender, bio)
VALUES ('张三', 'zhangsan@qq.com', 20, '男', '音乐爱好者');
-- 批量(效率更高)
INSERT INTO users (nickname, email, age, gender, bio) VALUES
('李四', 'lisi@qq.com', 21, '女', '古典音乐迷'),
('王五', 'wangwu@163.com', 19, '男', '摇滚青年'),
('赵六', 'zhaoliu@qq.com', 22, '女', '什么都听');user_id 和 created_at 不需要手动填——AUTO_INCREMENT 自动编号,DEFAULT NOW() 自动填当前时间。
UPDATE —— 修改数据
-- 语法:UPDATE 表名 SET 字段 = 新值 WHERE 条件;
-- 改昵称
UPDATE users SET nickname = '摇滚小王子' WHERE user_id = 3;
-- 改多个字段
UPDATE users
SET email = 'new@qq.com', bio = '开始学吉他了'
WHERE user_id = 1;
-- 在现有值上做计算
UPDATE songs SET play_count = play_count + 1 WHERE song_id = 1;铁律:WHERE 不能忘
-- ❌ 灾难!不加 WHERE 会改掉所有行
UPDATE users SET is_vip = 1;
-- ✅ 正确
UPDATE users SET is_vip = 1 WHERE user_id = 4;写 UPDATE 之前先写 WHERE,或者先用 SELECT 验证会影响到哪些行。
DELETE —— 删除数据
DELETE FROM users WHERE user_id = 5;同样必须带 WHERE。同样建议先用 SELECT * FROM users WHERE user_id = 5; 确认。
逻辑删除 vs 物理删除
真实项目很少直接用 DELETE。常见做法是改状态:
-- 逻辑删除(假删,数据还在)
UPDATE users SET is_deleted = 1 WHERE user_id = 5;
-- 查询时加条件:SELECT * FROM users WHERE is_deleted = 0;| 方式 | 优点 | 缺点 |
|---|---|---|
| 物理删除 | 干净 | 无法恢复 |
| 逻辑删除 | 可审计、可恢复 | 查询要多加条件 |
主键(Primary Key)
每行数据的"身份证":
| 规则 | 含义 |
|---|---|
| 唯一 | 不能有两个相同的 user_id |
| 非空 | 每行必须有 |
| 不变 | 一旦确定不能改 |
PRIMARY KEY AUTO_INCREMENT = 自动递增的整数主键,最常见的方案。
外键(Foreign Key)
表与表之间的"关系线":
-- 歌单表(外键指向 users)
CREATE TABLE playlists (
playlist_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);外键的"保护作用":
-- users 表里没有 user_id = 999
INSERT INTO playlists (name, user_id) VALUES ('测试', 999);
-- ❌ 报错!不存在的用户不能创建歌单
-- 张三有歌单,不能直接删掉张三
DELETE FROM users WHERE user_id = 1;
-- ❌ 报错!被引用的数据不能随意删除约束不是限制你,是在帮你挡住脏数据。
约束踩坑表
| 做的事 | 报错关键词 | 保护你的约束 |
|---|---|---|
| 插入重复的主键 | Duplicate entry | UNIQUE / PRIMARY KEY |
| 外键引用不存在的值 | foreign key constraint fails | FOREIGN KEY |
| 必填项传了 NULL | cannot be null | NOT NULL |
| 忘写 WHERE 的 UPDATE | 不报错但改了全表 | (没有约束能救你) |
小结
三句话记住建库建表 + 增删改:
- 建库建表 = 设计空白表格的表头(CREATE DATABASE → CREATE TABLE → 选数据类型)
- 增删改 = INSERT 加数据、UPDATE 改数据、DELETE 删数据,后两个永远带 WHERE
- 主键外键 = 主键是身份证(唯一标识),外键是关系线(连接两张表)
