insert into

用于向表插入数据。
注:
若要向分布式表中插入数据,请先调整配置项 enableInsertStatementForDFSTable。

语法

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