首批通过分布式安全可靠测评,为关键业务系统打造
INSERT
更新时间:2026-07-15 20:56:55
描述
该语句用于向表中添加一个或多个记录。
使用限制及注意事项
不支持直接对子查询进行插入操作,例如 INSERT INTO (SELECT * FROM t1) VALUES(1, 1)。
权限要求
- 执行
INSERT语句,需要拥有目标表的INSERT权限。 - 执行
INSERT ... SELECT ...语句,不仅需要拥有目标表的INSERT权限,还需要拥有源表(即SELECT子句中涉及的表)的有SELECT权限。
有关 OceanBase 数据库权限的详细介绍,请参见 MySQL 模式下的权限分类。
语法
INSERT [hint_options]
[IGNORE] [INTO]
single_table_insert
[ON DUPLICATE KEY UPDATE update_asgn_list];
hint_options:
[/*+ [APPEND] enable_parallel_dml PARALLEL(N) */]
single_table_insert:
table_name [PARTITION (partition_name, ...)] [(column_list)] {VALUES | VALUE} (values_list)[, (values_list) ...]
| table_name [PARTITION (partition_name, ...)] [(column_list)] select_stmt
| table_name [PARTITION (partition_name, ...)] SET update_asgn_list
column_list:
column_name [,column_name ...]
values_list:
value [,value ...]
value:
expr
| DEFAULT
update_asgn_list:
column_name = expr [,column_name = expr ...]
参数解释
| 参数 | 描述 |
|---|---|
| hint_options | 可选项,用于指定 Hint 选项,详细介绍可参见下文 hint_options。 |
| IGNORE | 可选项,指示在插入数据时发生的错误将会被忽略。 |
| INTO | 可选项,用来指示接下来是插入目标,可以省略。 |
| single_table_insert | 指定如何向表中插入数据。目前支持三种插入数据的方式,详细介绍可参见下文 single_table_insert。 |
| table_name | 指定要插入的表名。 |
| PARTITION (partition_name, ...) | 可选项,用于指定数据将被插入到表的哪个分区中。partition_name 表示插入表指定的分区名。 |
| column_name | 指定列名称。 |
| ON DUPLICATE KEY UPDATE update_asgn_list | 可选项,指定对重复主键或唯一键的处理操作。
update_asgn_list 表示赋值语句,详细介绍可参见下文 update_asgn_list。 |
hint_options
APPEND:使用 Hint 启用旁路导入功能。更多使用INSERT INTO旁路导入的信息,参见 使用 INSERT INTO SELECT 语句旁路导入数据。enable_parallel_dml parallel(N):可选项,加载数据的并行度。说明
一般情况下,
enable_parallel_dmlHint 和parallelHint 必须配合使用才能开启并行 DML。不过,当目标表的 Schema 上指定了表级别的并行度时,仅需指定enable_parallel_dmlHint。
single_table_insert
[(column_list)] {VALUES | VALUE} (values_list)[, (values_list) ...]:直接将一组明确的值插入至目标表中。column_list:可选项,指定插入数据对应的列名列表,多个列名间用逗号(,)分隔。VALUES | VALUE: 用于引入待插入值列表的关键字。values_list: 用于指定插入的数据值列表,用括号(())包围。可以有多个值列表,值列表间以逗号(,)分隔,每个值列表代表一行数据。values:插入的单个值,每个值对应一个列,值间以逗号(,)分隔。可以是表达式(expr)或DEFAULT关键字来使用列的默认值。
示例如下:
向表
test_tbl1中插入一行数数据。INSERT INTO test_tbl1(col1, col2) VALUES(1, 'A1');向表
test_tbl1中插入多行数据。INSERT INTO test_tbl1(col1, col2) VALUES(2, 'A2'),(3, 'A3');
[(column_list)] select_stmt:从一个或多个源表中选取数据,并将查询到的结果插入到目标表中。column_list:可选项,指定插入数据对应的列名列表,多个列名间用逗号(,)分隔。select_stmt: 指定要执行的查询语句,其结果将被插入到目标表中。select_stmt必须返回一个结果集,查询语句的具体结构和选项信息,参见 SELECT 语句。
示例如下:
INSERT INTO test_tbl1(col1, col2) SELECT col1, col2 FROM test_tbl2 WHERE col2 = 'a3';SET update_asgn_list:通过SET子句指定各列的值,从而将数据插入到目标表中。update_asgn_list表示赋值语句,详细介绍可参见下文 update_asgn_list。示例如下:
INSERT INTO test_tbl1 SET col1= 4, col2='a4';
update_asgn_list
column_name = expr [, ...]:列名等于表达式的列表,用于更新已存在的行,多个值对间用逗号(,)分隔。
示例如下:
指定当发生键冲突时,将目标行的
col2列的值更新为原本尝试插入的值(即VALUES(col2),在这个例子中是a2)。INSERT INTO test_tbl1(col1, col2) VALUES (2, 'a2') ON DUPLICATE KEY UPDATE col2 = VALUES(col2);