🗄️ 第三章 操作数据库-SQL的使用方法
📄 一句话概括

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:可以(没约束说不许空)

三、动手 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;

五、常见误区

  1. "INSERT 按列名顺序随便填" —— 整行塞时严格按建表顺序;想自由顺序就用点名塞,列名与值一一对应。
  2. "没填的列会自动填 0" —— 不会,是 NULL(没有值)。0 和 NULL 是两回事:0 是【有钱,0 元】,NULL 是【不知道有没有钱】。
  3. "一次插多行要写多条 INSERT" —— 多行塞一条搞定,效率还更高(省去多次语句开销)。
自测三问(点开对答案) 1. 三种插入姿势是什么?正式代码推荐哪种? **整行塞/点名塞/多行塞;推荐点名塞**——列名点清不怕列序变。 2. 没给值的列变成什么? **NULL(没有值)**,不是 0。 3. 插入时谁在门口把守? **类型与约束**——主键重复、类型不对都会被拒。

相关笔记