INSERT
INSERT¶
在表中创建新行。
- 语法
sql [ 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
为零。 - 参数
-
该SQL命令参数说明见下
with_query
-
WITH
子句允许您指定一个或多个子查询,这些子查询可以在INSERT
查询中按名称引用。对于包含WITH
子句的INSERT
命令, 该子句只能包含SELECT
语句,而WITH
子句不能包含数据修改命令(INSERT
,UPDATE
或DELETE
)。查询(
SELECT
语句)也可能包含WITH
子句。 在这种情况下,可以在INSERT
查询中引用两套with_query
,但是第二套优先,因为它的嵌套更紧密。WITH子句提供在一个更大的SELECT查询中,使用子查询或执行数据修改操作的方式。你可以在INSERT, UPDATE 或 DELETE 命令中使用WITH子句。
table
- 现有表的名称(可以由schema限定)。
column
- 表中列的名称。 如果需要,可以使用子字段名称或数组下标来限定列名称。 (仅插入到复合列的某些字段中,未指定的字段为空。)
DEFAULT VALUES
- 所有列均将填充其默认值。
expression
- 要分配给相应列的表达式或值。
DEFAULT
- 相应的列将填充其默认值。
query
- 提供要插入的行的查询(
SELECT
语句)。 有关语法的说明,请参见SELECT
语句。 output_expression
- 插入每行后,由
INSERT
命令计算并返回的表达式。 该表达式可以使用表的任何列名称。 写入*返回插入行的所有列。 output_name
- 用于返回的列的名称。
- 注解
-
要将数据插入分区表中,请指定根分区表,即使用
CREATE TABLE
命令创建的表。 您还可以在INSERT
命令中指定分区表的叶子表。如果数据对于指定的叶子表无效,则返回错误。 不支持在INSERT
命令中指定不是叶子表的子表。不支持在分区表的任何子表上执行其他DML命令,例如
UPDATE
和DELETE
。这些命令必须在根分区表(使用CREATE TABLE
命令创建的表)上执行。 - 示例
-
在表
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
子句的可能限制。 - 相关SQL命令
COPY
,SELECT
,CREATE EXTERNAL TABLE