模块 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 次尝试后可用的解决方案