📄 一句话概括
INSERT INTO 往表里一行行加记录——可以整行塞、可以点名塞、可以一次塞多行;塞的时候类型和约束照样在门口把守。
📝 本节和前面几节的关系
3-5 造好了 students 这副骨架;本节往里填肉——第一章【登记】这个词(1-2)从本节起变成一条条真命令。
一、三种插入姿势
-- 准备块(本章贯穿表,没建先跑这段)
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT,
class INTEGER,
score INTEGER
);
-- 姿势一:整行塞(按建表列的顺序,一个不落)
INSERT INTO students VALUES (1, '张三', 1, 85);
-- 姿势二:点名塞(列名和值一一对应,可跳过允许空的列)
INSERT INTO students (id, name, class) VALUES (2, '李四', 1); -- score 没给 → NULL
-- 姿势三:一次塞多行
INSERT INTO students (id, name, class, score) VALUES
(3, '王五', 2, 78),
(4, '赵六', 2, 64),
(5, '钱七', 3, NULL);
三种姿势的特点:
| 姿势 | 优点 | 风险 |
|---|---|---|
| 整行塞 | 短 | 列顺序变了值就串位——表结构一改全线崩 |
| 点名塞 | 列名点清,安全 | 稍长 |
| 多行塞 | 一次到位 | 中途某行违规,看 DBMS 策略 |
惯例:正式代码用姿势二——列名点名,读的人不用去翻表结构。
二、门口的守卫一直在
插入也要过 2-2 那道类型与约束的门:
INSERT INTO students VALUES (6, '王八', 1, 85);
-- 报错!UNIQUE constraint failed(主键 6 假设已存在时)
INSERT INTO students VALUES (7, '孙七', 1, NULL); -- score 给 NULL:可以(没约束说不许空)
- 主键重复 → 拒绝
- 类型对不上 → 拒绝(严格 DBMS)/ 放进去了但别学它(SQLite)
- 没给值的列 → NULL(空值,3-10 正式讲)
三、动手 Demo:把示例表凑齐
INSERT INTO students VALUES (1, '张三', 1, 85);
INSERT INTO students VALUES (2, '李四', 1, 92);
INSERT INTO students VALUES (3, '王五', 2, 78);
INSERT INTO students VALUES (4, '赵六', 2, 64);
INSERT INTO students VALUES (5, '钱七', 3, NULL);
SELECT * FROM students;
看到什么算成功:五行小表原样出现,钱七的 score 一格是空的(NULL)——不是 0,是【没有值】。记住这格,3-10 和 3-17 靠它掀桌子。
四、30 秒实验
试一次【故意串位】:
INSERT INTO students VALUES (6, 3, '周八', 90); -- 把 class 和 name 的值对调了
SELECT * FROM students;
——竟然插进去了!class 是 INTEGER、3 能塞;name 是 TEXT、'周八' 也能塞(SQLite 宽容)。这行脏数据就是【整行塞不看顺序】的真实下场:语法没错,业务全错。把它删掉:DELETE FROM students WHERE id = 6;
五、常见误区
- "INSERT 按列名顺序随便填" —— 整行塞时严格按建表顺序;想自由顺序就用点名塞,列名与值一一对应。
- "没填的列会自动填 0" —— 不会,是 NULL(没有值)。0 和 NULL 是两回事:0 是【有钱,0 元】,NULL 是【不知道有没有钱】。
- "一次插多行要写多条 INSERT" —— 多行塞一条搞定,效率还更高(省去多次语句开销)。
自测三问(点开对答案)
1. 三种插入姿势是什么?正式代码推荐哪种? **整行塞/点名塞/多行塞;推荐点名塞**——列名点清不怕列序变。 2. 没给值的列变成什么? **NULL(没有值)**,不是 0。 3. 插入时谁在门口把守? **类型与约束**——主键重复、类型不对都会被拒。- ☐ 下一节(3-7 SELECT-获取数据)
相关笔记
- CREATE TABLE、DROP TABLE-创建和删除表 —— 上一节:本节往那副骨架里填记录
- 🗄️ 数据库基础 · 索引 —— 全课路线图