pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
INSERT — 在表中插入新行
INSERT INTOtable[ (column[, ...] ) ] { 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权限。
table现有表的名称(可选地使用模式限定)。
columntable 中某一列的名称。如有需要,列名可以用子字段名或数组下标限定。(只向组合列的某些字段插入时,其余字段保持为空。)
DEFAULT VALUES所有列都会填入各自的默认值。
expression要赋予对应 column 的表达式或值。
DEFAULT对应的 column 将用它的默认值填充。
query提供要插入行的查询(SELECT语句)。其语法 说明请参见SELECT。
output_expressionINSERT命令在插入每行后要计算并返回的表达式。表达式可以使用table_name所指定表中的任何列名。写*可返回所插入行的所有列。
output_name用于返回列的名称。
成功完成时,INSERT 命令返回以下形式的命令标签:
INSERToidcount
其中,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;
INSERT符合 SQL 标准,但RETURNING子句是PostgreSQL扩展。此外,标准不允许省略列名列表、而又不是所有列都由VALUES子句或query填充的情况。
query子句可能存在的限 制见SELECT。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。