Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 节