🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 8.1: INSERT INTO 语句

到目前为止,我们专注于使用 SELECT 语句从现有表中检索数据。现在,我们将开始探索 数据操作语言 (DML),首先学习如何使用 INSERT INTO 语句向表中添加新数据。

课程插图

基本语法

使用 INSERT INTO 语句有两种主要方式。

1. 指定列(推荐)

这是最安全和最常用的方法。您明确列出要填充的列,然后是这些列的值。

INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);

2. 不指定列

如果您提供的是表中 所有 列的值,并且顺序与定义时完全一致,则可以省略列名。然而,这种方法灵活性较差,如果表结构发生变化可能会导致错误。

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

插入数据的重要规则

  • 数据类型: 您提供的值必须与相应列的数据类型匹配(例如,不能将文本插入到数字列中)。
  • 字符串和日期: 就像在 WHERE 子句中一样,字符串(文本)和日期值必须用单引号 (') 括起来。
  • 数字: 数值不需要引号。
  • NULL 值: 如果某列允许 NULL,而您没有为其提供值,则该列将填充为 NULL(如果定义了默认值,则填充为默认值)。

示例

示例 1:插入新演员

让我们向 Sakila 数据库中的 actor 表添加一位新演员。

INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');

注意:我们没有指定 actor_id,因为它通常由数据库自动生成。

示例 2:插入特定列

如果我们有一个包含许多列的表,但只想填充其中的几个:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('ALICE', 'JOHNSON', 'alice.j@example.com', 1, 5);

示例 3:多行插入

大多数现代数据库允许您通过用逗号分隔值集来在单个语句中插入多行。

INSERT INTO actor (first_name, last_name)
VALUES 
    ('TOM', 'HANKS'),
    ('MERYL', 'STREEP'),
    ('LEONARDO', 'DICAPRIO');

从另一个查询插入数据 (INSERT INTO ... SELECT)

有时您不需要手动输入数据,而是需要将数据从一个表转移到另一个表(例如,在归档或生成报告时)。为此,使用 INSERT INTOSELECT 的组合。

语法

INSERT INTO target_table (column1, column2, column3)
SELECT source_column1, source_column2, source_column3
FROM source_table
WHERE condition;

数据形成的灵活性

此命令的一个重要特性是,在 SELECT 块中可以组合不同类型的值:

  1. 选定值:直接来自源表 (source_column1)。
  2. 计算值:公式或函数的结果(例如,amount * 0.1)。
  3. 常量值:不在源表中的固定数据(例如,插入日期或状态作为字符串)。

示例:创建不活跃客户的归档

假设我们有一个 customer_archive 表,我们想将数据从主 customer 表转移到那里,同时添加归档日期和状态说明:

INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT 
    customer_id, 
    CONCAT(first_name, ' ', last_name), -- 计算值(全名)
    CURRENT_DATE,                       -- 常量(当前日期)
    'Auto-archived'                     -- 常量(文本标签)
FROM customer
WHERE active = 0;

注意:INSERT INTO 中的列数和顺序必须严格匹配 SELECT 返回的列数和顺序。


处理 NULL 和默认值

在插入行时,您不必为每一列提供值。数据库通过两种方式处理缺失值:通过 NULL 和通过列默认值。

显式插入 NULL

如果某列允许 NULL,您可以直接将关键字 NULL 作为值传递:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('BOB', 'SMITH', NULL, 1, 5);

在这里,email 列将存储为 NULL,表示“未知值”。

依赖列默认值

如果某列在表模式中定义了 DEFAULT 值,您可以完全从列列表中省略它。数据库将自动填充:

INSERT INTO actor (first_name, last_name)
VALUES ('CATE', 'BLANCHETT');

actor_id(自增)和 last_update(默认时间戳)这样的列由数据库自动填充,无需任何显式输入。

显式插入 DEFAULT

您还可以使用 DEFAULT 关键字在列列表中列出列的同时触发列的默认值:

INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);

当您的插入语句列出所有列但您仍希望数据库处理特定列时,这非常有用。


本课的关键要点:

  • INSERT INTO 语句用于向表中添加新行。
  • INSERT INTO ... SELECT 命令允许将数据从一个表复制到另一个表。
  • SELECT 块中,您可以组合来自表的真实数据、计算字段和常量。
  • 明确列出列名是为了更好的代码可靠性和可读性。
  • 字符串和日期值必须用单引号括起来。
  • 您可以一次插入多行以提高性能。
  • 可以省略或显式传递带有 NULLDEFAULT 值的列,使用 NULLDEFAULT 关键字。

在下一课中,我们将学习如何使用 UPDATE 语句 修改现有记录

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 添加地址记录
  2. 新员工记录输入
  3. 创建岛屿表