跳转到主要内容
模块 8 · 第 1 课(共 4)课程中的29/57~10 min
模块课程(1/4)

插入数据:INSERT

到目前为止,您已经读取数据。是时候写一些了。 INSERT 是 向表中添加新行的命令。

基本语法

SQL
INSERT INTO tabella (col1, col2, …)
VALUES (val1, val2, …);

我们的数据集示例:

SQL
INSERT INTO customers (first_name, last_name, email, city, country, signed_up_on)
VALUES ('Marco', 'Bianchi', 'marco.bianchi@example.com', 'Verona', 'Italia', '2025-07-15');

命名列是推荐的做法:它使查询 对未来架构更改具有鲁棒性(例如,新的可选 phone 列 不会破坏任何东西)和自我记录。

多行插入

一条语句,多行 — 比 N 个单独的 INSERT 快得多:

SQL
INSERT INTO categories (name, parent_id) VALUES
  ('Gaming',         1),
  ('Smart Home',     1),
  ('Cucina vegana',  8);

返回:读取刚刚插入的值

PostgreSQL 的一个子句特征:RETURNING 返回以下行: 刚刚创建。对于检索自动生成的 id 非常方便:

SQL
INSERT INTO categories (name, parent_id)
VALUES ('Gaming', 1)
RETURNING id, name;

输出是一个单行表,其中包含 id (由 SERIAL 分配)和 name。

如果缺少一列会发生什么

如果您省略 INSERT 中的一列:

  • 如果是 NOT NULL 没有 DEFAULT → 错误;
  • 如果它有一个 DEFAULT (包括 SERIAL 作为 id)→ 使用;
  • 如果它接受 NULL → 它会变成 NULL。
SQL
-- Va bene: id è SERIAL (auto), country ha NOT NULL ma forniamo tutti i campi
INSERT INTO customers (first_name, last_name, email, city, country, signed_up_on)
VALUES ('Olivia', 'Marini', 'olivia.marini@example.com', 'Bari', 'Italia', '2025-07-20');

-- Errore: first_name è NOT NULL e non è fornito
INSERT INTO customers (last_name, email, city, country, signed_up_on)
VALUES ('Marini', 'olivia.marini@example.com', 'Bari', 'Italia', '2025-07-20');

轮到你了

锻炼#sql.m8.l1.e1
尝试:0加载中...

在客户表中插入一个新客户,其名字为“Marco”,姓氏为“Bianchi”,电子邮件为“marco.bianchi@example.com”,城市为“维罗纳”,国家为“意大利”,签名日期为“2025-07-15”。明确命名所有列。

正在加载编辑器...
显示提示

VALUES 中值的顺序必须与您命名的列的顺序匹配。

3 次尝试后可用的解决方案

复习练习

锻炼#sql.m8.l1.e2
尝试:0加载中...

插入新的“游戏”类别作为“Elettronica”的子类别(id = 1)。使用 RETURNING 子句返回新创建的类别的 id 和名称。

正在加载编辑器...
显示提示

RETURNING 接受列列表(或“*”),就像 SELECT 一样。

3 次尝试后可用的解决方案