INSERT
更新时间:2026-06-25
INSERT
在表中创建新行。
语法
SQL
1 [ WITH [ RECURSIVE ] with_query [, ...] ]
2 INSERT INTO table [( column [, ...] )]
3 {DEFAULT VALUES | VALUES ( {expression | DEFAULT} [, ...] ) [, ...] | query}
4 [RETURNING * | output_expression [[AS] output_name] [, ...]]
5 ```
6
7
8
9## 描述
10
11`INSERT`将新行插入表中。 可以插入由值表达式指定的一或多个行,或查询产生的零或多个行。
12
13 目标列名称可以按任何顺序列出。 如果根本没有给出任何列名列表,则默认为表中的列按声明的顺序排列。`VALUES`子句或查询提供的值与从左到右的显式或隐式列列表相关联。
14
15 在显式或隐式列列表中不存在的每个列都将填充一个默认值,该默认值可以是其声明的默认值,如果没有默认值,则为null。
16
17 如果任何列的表达式的数据类型都不正确,则将尝试自动类型转换。
18
19 可选的`RETURNING`子句使`INSERT`根据实际插入的每一行计算并返回值。 这对于获取默认提供的值(例如序列号)很有用。但是,允许使用表列的任何表达式。 `RETURNING`列表的语法与`SELECT`的输出列表的语法相同。
20
21 须对表具有`INSERT`权限才能插入表中。 指定列列表后,仅需要对列出的列具有`INSERT`权限。使用`RETURNING`子句需要`RETURNING`中提到的所有列都具有`SELECT`权限。如果提供查询以插入查询中的行,则必须对查询中引用的任何表或列具有`SELECT`权限。
22
23
24 成功完成后,`INSERT`命令将返回以下形式的命令标记:
25
26 ``` sql
27 INSERT oid count
28 ```
29
30 `count`是插入的行数。 如果count恰好为1,并且目标表具有OID,则`oid`是分配给插入行的OID。 否则,`oid`为零。
31
32
33
34
35## 参数
36
37该SQL命令参数说明见下
38
39 `with_query`
40 : `WITH`子句允许您指定一个或多个子查询,这些子查询可以在`INSERT`查询中按名称引用。对于包含`WITH`子句的`INSERT`命令, 该子句只能包含`SELECT`语句,而`WITH`子句不能包含数据修改命令(`INSERT`,`UPDATE`或`DELETE`)。
41
42 查询(`SELECT`语句)也可能包含`WITH`子句。 在这种情况下,可以在`INSERT`查询中引用两套`with_query`,但是第二套优先,因为它的嵌套更紧密。
43
44 WITH子句提供在一个更大的SELECT查询中,使用子查询或执行数据修改操作的方式。你可以在INSERT, UPDATE 或 DELETE 命令中使用WITH子句。
45
46 `table`
47 : 现有表的名称(可以由schema限定)。
48
49 `column`
50 : 表中列的名称。 如果需要,可以使用子字段名称或数组下标来限定列名称。 (仅插入到复合列的某些字段中,未指定的字段为空。)
51
52 `DEFAULT VALUES`
53 : 所有列均将填充其默认值。
54
55 `expression`
56 : 要分配给相应列的表达式或值。
57
58 `DEFAULT`
59 : 相应的列将填充其默认值。
60
61 `query`
62 : 提供要插入的行的查询(`SELECT`语句)。 有关语法的说明,请参见`SELECT`语句。
63
64 `output_expression`
65 : 插入每行后,由`INSERT`命令计算并返回的表达式。 该表达式可以使用表的任何列名称。 写入\*返回插入行的所有列。
66
67 `output_name`
68 : 用于返回的列的名称。
69
70
71
72注解
73: 要将数据插入分区表中,请指定根分区表,即使用`CREATE TABLE`命令创建的表。 您还可以在`INSERT`命令中指定分区表的叶子表。如果数据对于指定的叶子表无效,则返回错误。 不支持在`INSERT`命令中指定不是叶子表的子表。
74
75 不支持在分区表的任何子表上执行其他DML命令,例如`UPDATE`和`DELETE`。这些命令必须在根分区表(使用`CREATE TABLE`命令创建的表)上执行。
76
77
78
79## 示例
80
81在表`films`中插入一行:
82
83 ``` sql
84 INSERT INTO films VALUES ('UA502', 'Bananas', 105,
85 '1971-07-13', 'Comedy', '82 minutes');
86 ```
87
88 在此示例中,省略了`length`列,因此它将具有默认值:
89
90 ``` sql
91 INSERT INTO films (code, title, did, date_prod, kind) VALUES
92 ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
93 ```
94
95 本示例对`date_prod`列使用`DEFAULT`子句,而不是指定值:
96
97 ``` sql
98 INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT,
99 'Comedy', '82 minutes');
100 ```
101
102 要插入完全由默认值组成的行:
103
104 ``` sql
105 INSERT INTO films DEFAULT VALUES;
106 ```
107
108 要使用多行`VALUES`语法插入多行:
109
110 ``` sql
111 INSERT INTO films (code, title, did, date_prod, kind) VALUES
112 ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
113 ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
114 ```
115
116 本示例从表`films`中向表`films`中插入一些行,其列布局与`films`相同:
117
118 ``` sql
119 INSERT INTO films SELECT * FROM tmp_films WHERE date_prod <
120 '2004-05-07';
121 ```
122
123
124 在表distributors中插入一行,返回由`DEFAULT`子句生成的序列号:
125
126 ``` sql
127 INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
128 RETURNING did;
129 ```
130
131
132
133
134兼容性说明
135: `INSERT`符合SQL标准。 标准不允许列名列表被省略,但不是所有的列都由`VALUES`子句或查询填充的情况。
136
137 `SELECT`记录了`query`子句的可能限制。
138
139
140
141相关SQL命令
142: `COPY`, `SELECT`, `CREATE EXTERNAL TABLE`
评价此篇文章
