# P12 12. 基础-SQL-DML-插入

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P12 12. 基础-SQL-DML-插入

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=12（p=12），时长 14:53
- 讲义：2.5.1 添加数据 p34–37（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p12.sql（先执行，再对照小例）

### 一句话理解

表建好后要往里放数据。这一集讲 INSERT 的三种写法：指定字段插、全字段插、一次插多行。

### 步骤

1. 指定字段：`INSERT INTO 表名(字段1,字段2) VALUES(值1,值2);`。字段和值要一一对应，顺序也要对。
2. 全字段：省略字段列表，`INSERT INTO 表名 VALUES(...)`。值的个数和顺序必须和表结构完全一致，表结构一改，这种写法就容易错位。
3. 批量：`VALUES (...),(...),(...)`，一次插多行，比循环单条快，也更不容易出现“插了一半”。
4. 值的类型要和字段匹配：字符串、日期加单引号，数字不加；没写的字段取默认值或 NULL。

### SQL 示例

```
INSERT INTO employee (id, name, age, dept_id, salary)
VALUES (5, '小赵', 24, 2, 9000);
SELECT * FROM employee WHERE id = 5;
```

说明：第一句只写五个字段并按顺序给值：`'小赵'` 是字符串所以要引号，9000 是数字不用。第二句只查 id=5，应返回 1 行：5、小赵、24、2、9000.00（salary 是 DECIMAL(10,2)，所以补两位小数）。先插再查，能确认落库的到底是什么，而不是“以为插进去了”。这张表和数据由本页练习脚本 p12.sql 建好（独立练习库 mysqlnotes_p12）。

### 易错点

- 字段列表和值列表个数不一致，报 Column count doesn't match value count。
- 字符串不加引号，MySQL 可能把它当列名，报 Unknown column。
- 全字段插入依赖列顺序。后来 ALTER 加了列，旧语句就会错位，甚至类型不匹配。
- 主键重复会插入失败；批量插入时一条失败，整条语句都算失败。

### 30 秒速记

指定字段最稳；全字段依赖列顺序；批量用逗号隔开多组值；字符串和日期要加引号。

### 自测

1. 为什么推荐写字段列表，而不是 `INSERT INTO 表 VALUES(...)`？
   - 答：写字段列表后，值的对应关系由名字决定，不受列顺序影响；以后加列或调整顺序，旧语句仍然正确。全字段写法一旦表结构变化就会错位。
2. 一条 INSERT 插三行，第二行主键冲突，结果会怎样？
   - 答：整条语句失败，三行都不会留下（InnoDB 下语句级回滚）。所以批量插入要么全成，要么全不成，不会只进一半。

### 材料与来源

- [平台视频页] B站原视频 P12《12. 基础-SQL-DML-插入》 https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=12
- [平台视频页] 本集采样画面 p12_t30.jpg（约 267s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=12
- [平台视频页] 本集采样画面 p12_t60.jpg（约 535s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=12
- [官方文档] MySQL 8.0 Reference Manual: INSERT https://dev.mysql.com/doc/refman/8.0/en/insert.html

证据说明：以同版讲义公开镜像核对：讲义 2.5.1 添加数据（p34–37）。原声字幕未取得（匿名接口字幕轨为空且需登录），讲师逐句讲解未核；本页示例、表与数字为站内原创，不是课堂原表。
