The non-streaming hint of insert into will use the streamin plan which is same as the plan of stream insert. It will also record the load info and return the label of insert stmt. The partition is supportted in insert into stmt. The result which meet the target partitions will be loaded. The introduction of example has been changed especially non-streaming insert. Also, the param of partition_names is added in sql syntax which is used to declare the target partition_names in target table. Change META_VERSION to 50
3.6 KiB
INSERT
Syntax
INSERT INTO table_name
[ PARTITION (, ...) ]
[ (column [, ...]) ]
[ \[ hint [, ...] \] ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
Description
INSERT 向一张表里插入数据。用户可以通过 VALUES 语法插入一条或者多条数据,或者通过一个查询来插入0条或者多条数据。
partition是目标分区,如果指定目标分区,则只会导入符合目标分区的数据。如果没有指定,则默认值为这张表的所有分区。
column是目标列,可以以任意的顺序存在。如果没有指定目标列,那么默认值是这张表的所有列。
如果表中的某个列没有存在目标列中,那么这个列需要有默认值,否则 INSERT 就会执行失败。
如果表达式的类型与目标列的类型不一致,那么会调用隐式类型转化,如果不能够进行转化,那么 INSERT 语句会报语法解析错误。
Parameters
tablet_name: 导入数据的目的表。可以是
db_name.table_name形式partition_names: 指定待导入的分区,必须是
table_name中存在的分区,多个分区名称用逗号分隔column_name: 指定的目的列,必须是
table_name中存在的列expression: 需要赋值给某个列的对应表达式
DEFAULT: 让对应列使用默认值
query: 一个普通查询,查询的结果会写入到目标中
hint: 用于指示
INSERT执行行为的一些指示符。streaming和 默认的非streaming方式均会使用同步方式完成INSERT语句执行 非streaming方式在执行完成后会返回一个 label 方便用户通过SHOW LOAD查询导入的状态
Note
当前执行 INSERT 语句时,对于有不符合目标表格式的数据,默认的行为是过滤,比如字符串超长等。但是对于有要求数据不能够被过滤的业务场景,可以通过设置会话变量 enable_insert_strict 为 true 来确保当有数据被过滤掉的时候,INSERT 不会被执行成功。
Examples
test 表包含两个列c1, c2。
- 向
test表中导入一行数据
INSERT INTO test VALUES (1, 2);
INSERT INTO test (c1, c2) VALUES (1, 2);
INSERT INTO test (c1, c2) VALUES (1, DEFAULT);
INSERT INTO test (c1) VALUES (1);
其中第一条、第二条语句是一样的效果。在不指定目标列时,使用表中的列顺序来作为默认的目标列。
第三条、第四条语句表达的意思是一样的,使用c2列的默认值,来完成数据导入。
- 向
test表中一次性导入多行数据
INSERT INTO test VALUES (1, 2), (3, 2 + 2)
INSERT INTO test (c1, c2) VALUES (1, 2), (3, 2 * 2)
INSERT INTO test (c1) VALUES (1), (3)
INSERT INTO test (c1, c2) VALUES (1, DEFAULT), (3, DEFAULT)
其中第一条、第二条语句效果一样,向test表中一次性导入两条数据
第三条、第四条语句效果已知,使用c2列的默认值向test表中导入两条数据
- 向
test表中同步的导入一个查询语句的返回结果
INSERT INTO test [streaming] SELECT * FROM test2
INSERT INTO test (c1, c2) [streaming] SELECT * from test2
- 向
test表中异步的导入一个查询语句结果
INSERT INTO test SELECT * FROM test2
INSERT INTO test (c1, c2) SELECT * from test2
异步的导入其实是,一个同步的导入封装成了异步。填写 streaming 和不填写的执行效率是一样的。
由于Doris之前的导入方式都是异步导入方式,为了兼容旧有的使用习惯,不加 streaming 的 INSERT 语句依旧会返回一个 label,用户需要通过SHOW LOAD命令查看此label导入作业的状态。