首批通过分布式安全可靠测评,为关键业务系统打造
INSERT
更新时间:2025-01-24 17:02:59
描述
该语句用于向表中添加一个或多个记录。
不支持直接对子查询进行插入操作,例如 INSERT INTO (SELECT * FROM t1) VALUES(1, 1)。
语法
INSERT {into_table_insert | overwrite_table_insert};
into_table_insert:
[/*+ [APPEND | DIRECT(bool, int, [load_mode])] enable_parallel_dml PARALLEL(N) | NO_DIRECT */]
[IGNORE] [INTO]
single_table_insert
[ON DUPLICATE KEY UPDATE update_asgn_list]
load_mode:
'full'
| 'inc_replace'
single_table_insert:
{dml_table_name values_clause
| dml_table_name '(' ')' values_clause
| dml_table_name '(' column_list ')' values_clause
| dml_table_name SET update_asgn_list
| dml_table_name select_stmt}
dml_table_name:
table_name [PARTITION (partition_name,...)]
values_clause:
{{VALUES | VALUE} ({expr | DEFAULT},...) [, ...]
| select_stmt}
column_list
column_name [, ...]
update_asgn_list:
column_name = expr [, ...]
overwrite_table_insert:
[/*+PARALLEL(N)*/] OVERWRITE table_name [(list_of_columns)] [PARTITION (partition_name, ...)] select_stmt;
参数解释
| 参数 | 描述 |
|---|---|
| APPEND | DIRECT() | 使用 Hint 启用旁路导入功能,可选项。
注意在执行旁路导入任务的过程中,不建议同时进行 OceanBase 数据库的升级操作,因为这可能导致旁路导入任务失败。
INSERT INTO SELECT 旁路导入的信息,参见 旁路导入。 |
| enable_parallel_dml parallel(N) | 加载数据的并行度,N 默认为 4。
说明一般情况下, |
| NO_DIRECT | 控制单条 SQL 强制不走旁路导入,只要输入的 SQL 带有该 Hint,则整个语句忽略其他旁路导入的 Hint,执行普通导入。 |
| IGNORE | 在 INSERT 语句执行过程中发生的错误将会被忽略。 |
| column_list | 用于指定插入数据的列,同时插入多列时以逗号(,)分隔。 |
| table_name | 指定要插入的表名。 |
| partition_name | 插入表指定的分区名,同时插入多个分区时以逗号(,)分隔。 |
| update_asgn_list | 赋值语句,例如 c1 = 2。 |
| ON DUPLICATE KEY UPDATE | 指定对重复主键或唯一键的处理。如果指定了 ON DUPLICATE KEY UPDATE,当要插入的主键或唯一键有重复时,会用配置值替换待插入的值;如果不指定 ON DUPLICATE KEY UPDATE,当要插入的主键或唯一键有重复时,插入报错。 |
| overwrite_table_insert | 用于将查询结果替换表或分区中的现有数据,有关使用 INSERT OVERWRITE SELECT 语句的详细信息,参见 插入数据 中的 使用 INSERT OVERWRITE SELECT 语句插入数据 章节。 |
| list_of_columns | 指定表中需要插入数据的列。 |
| select_stmt | 指定 SELECT 子句。有关查询语句的详细信息,参见 SELECT 语句。 |
示例
示例表及数据基于以下定义:
obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;
Query OK, 0 rows affected
obclient> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT);
Query OK, 0 rows affected
obclient> SELECT * FROM t2;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set
向表
t1中插入一行数数据。obclient> INSERT INTO t1 VALUES(1,1); Query OK, 1 row affected obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set向表
t1中插入多行数据。obclient> INSERT t1 VALUES(1,1),(2,DEFAULT),(2+2,3*4); Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | NULL | | 4 | 12 | +----+------+ 3 rows in set向表
t1指定的p0分区插入单行数据。obclient> INSERT INTO t1 PARTITION(p0) (c1) VALUES(5); Query OK, 1 row affected obclient> SELECT * FROM t1 PARTITION(p0); +----+------+ | c1 | c2 | +----+------+ | 5 | NULL | +----+------+ 1 row in set向表
t1中插入重复主键值时利用ON DUPLICATE KEY UPDATE功能进行值更新。obclient> INSERT INTO t1 VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE c1=100; Query OK, 3 rows affected Records: 2 Duplicates: 1 Warnings: 0 obclient> SELECT * FROM t1; +-----+------+ | c1 | c2 | +-----+------+ | 100 | 1 | +-----+------+ 1 row in set向可更新视图
v的插入值。obclient> CREATE VIEW v AS SELECT * FROM t1; Query OK, 0 rows affected obclient> INSERT INTO v VALUES (1,1); Query OK, 1 row affected obclient> SELECT * FROM v; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set向
t1表中插入t2的查询结果。obclient> INSERT INTO t1 SELECT * FROM t2 WHERE c1>2; Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM t1; +----+------+ | c1 | c2 | +----+------+ | 3 | 3 | | 4 | 4 | +----+------+ 2 rows in set