选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

第 6 章 数据操纵

前一章讨论了如何创建用于保存数据的表和其他结构。现在该把数据填入表中了。本章介绍如何插入、更新和删除表数据。下一章则终于会讲到如何从数据库中取回那些久寻不得的数据。

6.1. 插入数据 #

创建表时,其中不包含任何数据。在数据库真正派上用场之前,首先要做的就是插入数据。从概念上说,数据一次插入一行。当然也可以插入多行,但不能插入少于一行的数据。即使只知道部分列值,也必须创建完整的一行。

要创建新行,可使用INSERT 命令。该命令需要提供表名和列值。例如,考虑第 5 章中的 products 表:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

插入一行的示例命令如下:

INSERT INTO products VALUES (1, 'Cheese', 9.99);

数据值按列在表中出现的顺序列出,并以逗号分隔。通常,数据值会是字面量(常量),但也允许使用标量表达式。

上述语法的缺点在于你必须知道表中列的顺序。为了避免这一点,你也可以显式列出列。例如,下面两条命令的效果都与上面的命令相同:

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);

许多用户认为,总是列出列名是一种好习惯。

如果你没有所有列的值,可以省略其中一些列。在这种情况下,这些列将填入各自的默认值。例如:

INSERT INTO products (product_no, name) VALUES (1, 'Cheese');
INSERT INTO products VALUES (1, 'Cheese');

第二种形式是PostgreSQL 的一个扩展。它从左到右用给出的值填充各列,其余列则取默认值。

为求清晰,你也可以显式请求默认值,既可以针对单个列,也可以针对整行:

INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;

你可以在一条命令中插入多行:

INSERT INTO products (product_no, name, price) VALUES
    (1, 'Cheese', 9.99),
    (2, 'Bread', 1.99),
    (3, 'Milk', 2.99);

也可以插入一个查询的结果(它可能返回零行、一行或多行):

INSERT INTO products (product_no, name, price)
  SELECT product_no, name, price FROM new_products
    WHERE release_date = 'today';

这使你能够利用 SQL 查询机制的全部能力(见第 7 章)来计算要插入的行。

提示

当需要一次插入大量数据时,可以考虑使用 COPY命令。 它不像INSERT 命令那样灵活,但效率更高。关于如何改善批量装载性能的更多信息,请参阅第 14.4 节

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。