insert into

Insert new records to a table.

Note: To insert values into DFS tables, please configure enableInsertStatementForDFSTable=true.

Syntax

insert into
  table_name1
  values (X, [Y, ...]) | select col_name(s) from table_name2

Here, colName specifies the column name in the target table, which can be in one of the following three forms:

  • Unquoted column name colName

  • Column name enclosed in double quotes "colName"

  • Double-quoted column name prefixed with an underscore _"colName"

Examples

Insert using VALUE clause

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

The above code example can also be written in a way that follows the ANSI SQL standard for inserting multiple rows into the table directly. This alternative approach yields the same result.

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

To only insert values for a subset of columns:

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

Starting from version 3.00.5, insert into supports using a SELECT clause to insert query results directly into the target table.

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
ticker volume
XOM 100
GS 80
FB 120
GOOG 110
AMZN 90
NFLX 150

Inserting all columns in the table is equivalent to the following two expressions

insert into t1 select * from t2
insert into t1 t2

Starting from version 3.00.5.1, the INSERT INTO statement supports the ON DUPLICATE KEY UPDATE clause for inserting data under the MySQL dialect. If the primary key already exists, the corresponding record will be updated; otherwise, a new record will be inserted.

Note:
This feature is available only with the MySQL dialect, and the target table must be a dimension table of PKEY engine. You must set enableInsertStatementForDFSTable=true before using it.Create a PKEY engine dimension table and insert initial data.
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
Insert data using the ON DUPLICATE KEY UPDATE clause.
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
As shown above, records with primary key id 1, 2, and 3 already exist, so the c column in those rows is updated by c = c + 1. Records with primary key id 4 and 5 do not exist, so they are inserted as new records.Functions can be used in the ON DUPLICATE KEY UPDATE clause. For example, use the now() function to refresh the update time to the current time:
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
You can use VALUES(col) to reference the new value from the current INSERT. Note that VALUES(col) can only be used as a complete right-hand value; it cannot be part of an expression (e.g., 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
You can update a field to NULL:
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