支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: 开发版
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

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 节

提交更正

如果你在文档中看到任何不正确的内容,或者与你使用特定功能的体验不符,或者需要进一步澄清的内容,请使用 此表格 报告文档问题。