INSERT

INSERT

在表中创建新行。

概要

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

描述

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

目标列名称可以按任何顺序列出。 如果根本没有给出任何列名列表,则默认为表中的列按声明的顺序排列。 VALUES子句或查询提供的值与从左到右的显式或隐式列列表相关联。

在显式或隐式列列表中不存在的每个列都将填充一个默认值,该默认值可以是其声明的默认值,如果没有默认值,则为null。

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

可选的RETURNING子句使INSERT根据实际插入的每一行计算并返回值。 这对于获取默认提供的值(例如序列号)很有用。 但是,允许使用表列的任何表达式。 RETURNING列表的语法与SELECT的输出列表的语法相同。

您必须对表具有INSERT特权才能插入表中。 指定列列表后,仅需要对列出的列具有INSERT特权。 使用RETURNING子句需要RETURNING中提到的所有列都具有SELECT特权。 如果提供查询以插入查询中的行,则必须对查询中引用的任何表或列具有SELECT特权。

输出

成功完成后,INSERT命令将返回以下形式的命令标记:

INSERT oid count

count是插入的行数。 如果count恰好为1,并且目标表具有OID,则oid是分配给插入行的OID。 否则,oid为零。

参数

with_query
WITH子句允许您指定一个或多个子查询,这些子查询可以在INSERT查询中按名称引用。
对于包含WITH子句的INSERT命令, 该子句只能包含SELECT语句, 而WITH子句不能包含数据修改命令(INSERTUPDATEDELETE)。
查询(SELECT语句)也可能包含WITH子句。 在这种情况下,可以在INSERT查询中引用两套with_query, 但是第二套优先,因为它的嵌套更紧密。
更多信息,请参考WITH查询(公用表表达式)SELECT
table
现有表的名称(可以由schema限定)。
column
表中列的名称。 如果需要,可以使用子字段名称或数组下标来限定列名称。 (仅插入到复合列的某些字段中,未指定的字段为空。)
DEFAULT VALUES
所有列均将填充其默认值。
expression
要分配给相应列的表达式或值。
DEFAULT
相应的列将填充其默认值。
query
提供要插入的行的查询(SELECT语句)。 有关语法的说明,请参见SELECT语句。
output_expression
插入每行后,由INSERT命令计算并返回的表达式。 该表达式可以使用表的任何列名称。 写入*返回插入行的所有列。
output_name
用于返回的列的名称。

注解

要将数据插入分区表中,请指定根分区表,即使用CREATE TABLE命令创建的表。 您还可以在INSERT命令中指定分区表的叶子表。 如果数据对于指定的叶子表无效,则返回错误。 不支持在INSERT命令中指定不是叶子表的子表。 不支持在分区表的任何子表上执行其他DML命令,例如UPDATEDELETE。 这些命令必须在根分区表(使用CREATE TABLE命令创建的表)上执行。

对于追加优化表,Greenplum数据库最多可将127个并发INSERT事务插入单个追加优化表中。

对于可写的S3外部表,INSERT操作将上传到已配置的S3存储桶中的一个或多个文件, 如s3:// 协议中所述。 按Ctrl-c取消INSERT,并停止上传到S3。

示例

在表films中插入一行:

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

在此示例中,省略了length列,因此它将具有默认值:

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

本示例对date_prod列使用DEFAULT子句,而不是指定值:

INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT, 
'Comedy', '82 minutes');

要插入完全由默认值组成的行:

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中向表films中插入一些行,其列布局与films相同:

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < 
'2004-05-07';
在表distributors中插入一行,返回由DEFAULT子句生成的序列号:
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

兼容性

INSERT符合SQL标准。 标准不允许列名列表被省略,但不是所有的列都由VALUES子句或查询填充的情况。

SELECT记录了query子句的可能限制。