insert into
语法
insert into
table_name1 (colName1 [, colName2, ...])
values (X [, Y, ...]) | select col_name(s) from table_name2
其中, colName 指定目标表中的列名,可以有以下三种方式:
-
不加引号的列名
colName -
双引号括起来的列名
"colName" -
前加下划线的双引号列名
_"colName"
例子
使用 VALUE 子句插入
t=table(`XOM`GS`FB as ticker, 100 80 120 as volume);
t;
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
insert into t values(`GOOG, 200);
t;
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
| GOOG | 200 |
insert into t values(`AMZN`NFLX, 300 250);
t;
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
| GOOG | 200 |
| AMZN | 300 |
| NFLX | 250 |
insert into t values(('AMD','NVDA'), (60 400));
t;
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
| GOOG | 200 |
| AMZN | 300 |
| NFLX | 250 |
| AMD | 60 |
| NVDA | 400 |
上例还有另一种写法,即按照 SQL 标准写法,直接向表 t 传入多行数据。
insert into t values
('AMD', 60),
('NVDA', 400);
t;
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
| GOOG | 200 |
| AMZN | 300 |
| NFLX | 250 |
| AMD | 60 |
| NVDA | 400 |
只往部分列插入新的记录:
insert into t(ticker, volume) values(`UBER`LYFT, 0 0);
t;
| ticker | price | volume |
|---|---|---|
| XOM | 98.5 | 100 |
| GS | 12.3 | 80 |
| FB | 40.6 | 120 |
| GOOG | 100.6 | 200 |
| AMZN | 120 | 300 |
| NFLX | 56.6 | 250 |
| AMD | 78.6 | 60 |
| NVDA | 33.1 | 400 |
| UBER | 0 | |
| LYFT | 0 |
自 3.00.5 版本起,insert into 支持使用 SELECT 子句,将查询得到的结果直接插入到目标表中。
t1 = table(`XOM`GS`FB as ticker, 100 80 120 as volume)
t1
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
t2 = table(`GOOG`AMZN`NFLX as ticker, 100 80 120 as volume);
t2
| ticker | volume |
|---|---|
| GOOG | 110 |
| AMZN | 90 |
| NFLX | 150 |
insert into t1(ticker,volume) select ticker,volume from t2
t1
| ticker | volume |
|---|---|
| XOM | 100 |
| GS | 80 |
| FB | 120 |
| GOOG | 110 |
| AMZN | 90 |
| NFLX | 150 |
将表中所有列插入,等价于以下两种写法
insert into t1 select * from t2
insert into t1 t2
自 3.00.5.1 版本起,insert into 在 MySQL 方言下支持使用 on duplicate key update 子句插入数据。若主键已存在则更新对应记录,若不存在则插入新记录。
仅在 MySQL 方言下可用,且目标表必须是 PKEY
引擎维度表;使用前需指定配置项
enableInsertStatementForDFSTable=true
创建 PKEY 引擎维度表并写入初始数据。
t = keyedTable(`id, 1 2 3 as id, 10 20 30 as c, 100 200 300 as c2, 2024.01.01T09:30:00.000 2024.01.01T09:31:00.000 2024.01.01T09:32:00.000 as update_time)
dbName = "dfs://test_duplicate"
if (existsDatabase(dbName))
{
dropDatabase(dbName)
}
db = database(dbName, VALUE, [1], engine=`PKEY)
pt = db.createDimensionTable (t, `pt, primaryKey=`id).append!(t)
| id | c | c2 | update_time |
|---|---|---|---|
| 1 | 10 | 100 | 2024.01.01 09:30:00.000 |
| 2 | 20 | 200 | 2024.01.01 09:31:00.000 |
| 3 | 30 | 300 | 2024.01.01 09:32:00.000 |
使用 on duplicate key update 子句插入数据。
insert into pt (id, c) values (1 2 3 4 5, 0 0 0 40 50) on duplicate key update c = c + 1
| id | c | c2 | update_time |
|---|---|---|---|
| 1 | 11 | 100 | 2024.01.01 09:30:00.000 |
| 2 | 21 | 200 | 2024.01.01 09:31:00.000 |
| 3 | 31 | 300 | 2024.01.01 09:32:00.000 |
| 4 | 40 | ||
| 5 | 50 |
如上所示,主键 id 为 1、2、3 的记录已存在,对应行的 c 列执行 c = c + 1 完成更新;主键 id 为 4、5 的记录不存在,因此作为新记录直接插入。
on duplicate key update 子句中可以使用函数。例如,使用 now()
函数将更新时间刷新为当前时间:
insert into pt (id, c, update_time) values (1 2 3, 0 0 0, 0 0 0) on duplicate key update c = c + 1, update_time = now()
| id | c | c2 | update_time |
|---|---|---|---|
| 1 | 12 | 100 | 2026.07.31 16:17:20.683 |
| 2 | 22 | 200 | 2026.07.31 16:17:20.683 |
| 3 | 32 | 300 | 2026.07.31 16:17:20.683 |
| 4 | 40 | ||
| 5 | 50 |
通过 values(col) 可以引用本次插入的新值。注意
values(col) 只能作为完整右值使用,不支持参与表达式运算(如 values(col) +
1)。
insert into pt (id, c, c2, update_time) values (1 2 3, 4 5 6, 0 0 0, 0 0 0) on duplicate key update c2 = values(c), update_time = now()
| id | c | c2 | update_time |
|---|---|---|---|
| 1 | 12 | 4 | 2026.07.31 16:19:05.325 |
| 2 | 22 | 5 | 2026.07.31 16:19:05.325 |
| 3 | 32 | 6 | 2026.07.31 16:19:05.325 |
| 4 | 40 | ||
| 5 | 50 |
支持将字段更新为空值:
insert into pt (id, c, c2, update_time) values (1 2 3, 4 5 6, 0 0 0, 0 0 0) on duplicate key update c2 = NULL, update_time = now()
| id | c | c2 | update_time |
|---|---|---|---|
| 1 | 12 | 2026.07.31 16:21:26.608 | |
| 2 | 22 | 2026.07.31 16:21:26.608 | |
| 3 | 32 | 2026.07.31 16:21:26.608 | |
| 4 | 40 | ||
| 5 | 50 |
