Postgresql 中文操作指南
6.1. Inserting Data #
在创建表时,表中不包含任何数据。在数据库变得实际有用之前要做的第一件事是插入数据。每次插入一行数据。你也可以在单个命令中插入多行,但不能插入不完整的行。即便你只知道某些列的值,也必须创建完整的一行。
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 查询机制 ( Chapter 7) 的全部功能。
Tip
在一次插入大量数据时,请考虑使用 COPY 命令。它不如 INSERT 命令灵活,但效率更高。请参阅 Section 14.4 以了解有关提高批量加载性能的更多信息。