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子句不能包含数据修改命令(INSERT,UPDATE或DELETE)。
- 查询(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命令,例如UPDATE和DELETE。 这些命令必须在根分区表(使用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';
INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') RETURNING did;
兼容性
INSERT符合SQL标准。 标准不允许列名列表被省略,但不是所有的列都由VALUES子句或查询填充的情况。
SELECT记录了query子句的可能限制。