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

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 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

INSERT

INSERT — 在表中插入新行

大纲

[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ ( column_name [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

描述

INSERT将新行插入表中。可以插入由值表达式指定的 一行或多行,也可以插入由查询产生的零行或多行。

目标列名可以按任意顺序列出。如果根本未给出列名列表,则默认使用按 声明顺序排列的全部列;或者如果VALUES子句或 query只提供了N列, 则默认使用按声明顺序排列的前N个列名。 VALUES子句或query 提供的值,会按从左到右的顺序与显式或隐式列列表对应起来。

任何未出现在显式或隐式列列表中的列都会填入默认值;如果没有声明默认 值,则填入空值。

如果任何列的表达式数据类型不正确,将尝试自动进行类型转换。

可选的RETURNING子句使INSERT 基于每个实际插入的行计算并返回一个或多个值。这主要用于获取 由默认值提供的值,例如 serial 序列号。不过,也允许使用任何引用该表列 的表达式。RETURNING列表的语法与 SELECT的输出列表相同。

要向表中插入行,必须具有该表上的INSERT权限。 如果指定了列列表,则只需要对所列的列具有INSERT权限。 使用RETURNING子句要求具有SELECT权限,涵盖RETURNING中提到的所有列。如果使用query子句从查询中插入行,当然需要在查询使用的任何表或列上具有SELECT权限。

参数

with_query

WITH子句允许指定一个或多个子查询,这些子查 询可以在INSERT查询中按名称引用。详见 第 7.8 节SELECT

querySELECT语句)本身也可以包含 WITH子句。在这种情况下, query中可以引用两组 with_query,但由于第二组嵌套得更近, 它具有更高的优先级。

table_name

现有表的名称(可选地使用模式限定)。

column_name

名为table_name的表 中某一列的名称。如有需要,列名可以附带子字段名或数组下标。 (只向组合列的部分字段插入值时,其余字段将为空值。)

DEFAULT VALUES

所有列都会填入各自的默认值。

expression

赋给相应列的表达式或值。

DEFAULT

相应列将填入其默认值。

query

提供要插入行的查询(SELECT语句)。其语法 说明请参见SELECT

output_expression

INSERT命令在插入每行后要计算并返回的表达式。表达式可以使用table_name所指定表中的任何列名。写*可返回所插入行的所有列。

output_name

用于返回列的名称。

输出

成功完成时,INSERT 命令返回以下形式的命令标签:

INSERT oid count

其中,count 是插入的行数。如果 count 恰好为一,且目标表有 OID,则 oid 表示分配给插入行的 OID。该单行必须是插入的,而不是更新的。否则 oid 为零。

如果INSERT命令包含RETURNING 子句,则结果将类似于一个SELECT语句,其中包含 RETURNING列表定义的列和值,它们是基于该命令插 入或更新的行计算出来的。

示例

向表films插入一行:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');

在这个示例中,省略了len列,因此它将取默认值:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

这个示例对日期列使用DEFAULT子句,而不是显式 指定值:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes');
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');

要插入一行,其所有列都由默认值构成:

INSERT INTO films DEFAULT VALUES;

使用多行VALUES语法插入多行:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

这个示例从与films列布局相同的 tmp_films表中选出一些行并插入到 films表:

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';

这个示例向数组列插入值:

-- Create an empty 3x3 gameboard for noughts-and-crosses
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- The subscripts in the above example aren't really needed
INSERT INTO tictactoe (game, board)
    VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');

向表distributors插入一行,并返回由 DEFAULT子句生成的序号:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

为负责 Acme Corporation 账户的销售人员增加销量计数,并把整个更 新后的行连同当前时间记录到日志表中:

WITH upd AS (
  UPDATE employees SET sales_count = sales_count + 1 WHERE id =
    (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation')
    RETURNING *
)
INSERT INTO employees_log SELECT *, current_timestamp FROM upd;

兼容性

INSERT符合 SQL 标准,但 RETURNING子句是 PostgreSQL扩展,在 INSERT中使用WITH的能力也是扩展。 此外,标准不允许省略列名列表却又不是所有列都由VALUES 子句或query填充的情况。

query子句可能存在的限 制见SELECT

提交更正

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