MySQL 零基础教程

MySQL INSERT INTO 语句

INSERT INTO 语句是向现有表中添加新数据行的基础命令。在其最明确的形式中,你需要精确地定义要填充哪些列并提供相应的值,从而确保数据库引擎准确知道将数据放置在何处。

1. 指定列名插入 (Explicit Column Insertion)

标准语法要求你指定表名、打算填充的列名列表,以及具体的数据值。当你明确列出你的列时,你就能精确控制数据的插入顺序,并使你的代码能够抵御未来表结构(Schema)的变化。

-- 向 'customers'(客户)表中插入一条新记录
INSERT INTO customers (first_name, last_name, email, created_at)
VALUES ('Jane', 'Doe', 'jane.doe@example.com', '2023-10-27 10:00:00');

在这个例子中,数据库将 'Jane' 映射到 first_name,将 'Doe' 映射到 last_name,依此类推。提供的值的数量必须与提供的列的数量相匹配。 如果你省略了一个允许 NULL 值或定义了默认值(Default)的列,数据库会自动为你处理。

2. 不指定列名的按位置插入

如果你要向表中的每一列插入值,并且严格按照创建表时定义的顺序,你可以省略列名列表。

-- 向 'employees'(员工)表的所有列中按顺序插入数据
INSERT INTO employees 
VALUES (101, 'Robert', 'Smith', 'IT', 75000);

虽然这在语法上是正确的,但在专业开发环境中通常被认为是一种不良实践。如果表结构发生变化——例如,数据库管理员添加了一个新列或更改了列的物理顺序——这个查询将会直接报错,或者更糟的是,将数据静默插入到错误的列中。请始终优先使用上一节中明确指定列名的方式。

3. 处理特殊值和默认值

数据库表通常包含带有默认值的列(例如账户自动生成的创建时间戳)或用于可选字段的 NULL 值。你有两种主要方法来处理这些情况:

  • 显式指定: 你可以在 VALUES 列表中明确地写入 DEFAULT 关键字或 NULL
  • 隐式省略: 如果一列有 DEFAULT 约束(或者允许为空),只需在你的 INSERT 语句中完全省略该列,数据库就会自动应用该默认值或填入空值。
-- 假设 'status' 字段默认为 'active',并且 'bio' 字段允许为 NULL
INSERT INTO users (username, password_hash)
VALUES ('jdoe_dev', 'secret_hash_123');

数据库引擎按照特定的内部流程执行这些操作,以确保在将数据正式提交(写入)到磁盘之前,完全满足数据完整性约束——例如主键(Primary Keys)唯一性或 NOT NULL(非空)要求。

插入操作的内部执行逻辑:

  1. 开始 INSERT 语句
  2. 检查约束 (Check Constraints)
    • 若发生 主键冲突 (Primary Key Conflict) 或 缺少 NOT NULL 值 (NOT NULL Missing) → 拒绝该行 (Reject Row) 并报错。
    • 若是 有效数据 (Valid Data) → 准备数据 (Prepare Data)。
  3. 写入表 (Write to Table)
  4. 更新索引 (Update Indexes)
  5. 确认成功 (Confirm Success)