# 6.1.插入数据

创建表时,它不包含任何数据。在数据库发挥巨大作用之前,首先要做的是插入数据。数据一次插入一行。也可以在单个命令中插入多行,但不能插入不完整的行。即使只知道一些列值,也必须创建完整的行。

要创建新行,请使用插入命令该命令需要表名和列值。例如,考虑产品表第五章:

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查询机制的全部功能(第七章)用于计算要插入的行。

# 提示

在插入大量数据的同时,考虑使用复制命令它不像以前那样灵活插入命令,但效率更高。提到第14.4节有关提高散装装载性能的更多信息。