上云无忧 > 文档中心 > 百度数据仓库 Palo SQL语法手册 - INSERT
百度数据仓库 Palo Doris版
百度数据仓库 Palo SQL语法手册 - INSERT

文档简介:
INSERT Description: INSERT INTO table_name [ PARTITION (p1, ...) ] [ WITH LABEL label] [ (column [, ...]) ] { VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query } table_name: 需要导入数据的表名。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

INSERT

Description

INSERT INTO table_name [ PARTITION (p1, ...) ] [ WITH LABEL label] [ (column
 [, ...]) ] { VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }

  • table_name

    需要导入数据的表名。

  • PARTITION

    指定需要导入数据的分区。

  • WITH LABEL

    为本次 INSERT 操作指定一个 Label。如果不指定,则系统会自动生成一个随机 ID。

  • column

    指定目标列顺序

  • VALUES | query

    INSERT 操作支持两种方式。一种是通过 VALUES 语句即常量表达式进行单行数据写入。另一种是用过 Query 语句从其他表中查询数据并导入。

Example

  1. 向 test 表中导入一行数据

    INSERT INTO test VALUES (1, 2); INSERT INTO test (c1, c2) VALUES (1, 2); INSERT

    其中第一条、第二条语句是一样的效果。在不指定目标列时,使用表中的列顺序来作为默认的目标列。

    第三条、第四条语句表达的意思是一样的,使用c2列的默认值,来完成数据导入。

  2.  INTO test (c1, c2) VALUES (1, DEFAULT); INSERT INTO test (c1) VALUES (1);
  3. 向test表中一次性导入多行数据

    INSERT INTO test VALUES (1, 2), (3, 2 + 2); INSERT INTO test (c1, c2) VALUES (1, 2), (3, 2 * 2); 

    其中第一条、第二条语句效果一样,向test表中一次性导入两条数据

    第三条、第四条语句效果已知,使用c2列的默认值向test表中导入两条数据

  4. INSERT INTO test (c1) VALUES (1), (3); INSERT INTO test (c1, c2) VALUES (1, DEFAULT), (3, DEFAULT);
  5. 向 test 表中导入一个查询语句结果

    INSERT INTO test SELECT * FROM test2; INSERT INTO test (c1, c2) SELECT * from test2; INSERT INTO 
  6. tbl1 WITH LABEL label1 WITH cte1 AS (SELECT * FROM tbl1), cte2 AS (SELECT * FROM tbl2) SELECT k1 
  7. FROM cte1 JOIN cte2 WHERE cte1.k1 = 1;
  8. 向 test 表中导入一个查询语句结果,并指定 partition 和 label

    INSERT INTO test PARTITION(p1, p2) WITH LABEL `label1` SELECT * FROM test2; INSERT INTO test WITH
  9.  LABEL `label1` (c1, c2) SELECT * from test2;

Keywords

INSERT

最佳实践

  1. 查看返回结果

    INSERT 操作是一个同步操作,返回结果即表示操作结束。用户需要根据返回结果的不同,进行对应的处理。

    1. 执行成功,结果集为空

      如果 insert 对应 select 语句的结果集为空,则返回如下:

      mysql> insert into tbl1 select * from empty_tbl; Query OK, 0 rows affected (0.02 sec)

      Query OK 表示执行成功。0 rows affected 表示没有数据被导入。

    2. 执行成功,结果集不为空

      在结果集不为空的情况下。返回结果分为如下几种情况:

      1. Insert 执行成功并可见:

        mysql> insert into tbl1 select * from tbl2; Query OK, 4 rows affected (0.38 sec) 

        Query OK 表示执行成功。4 rows affected 表示总共有4行数据被导入。2 warnings 表示被过滤的行数。

        同时会返回一个 json 串:

        {'label':'my_label1', 'status':'visible', 'txnId':'4005'} {'label':'insert_f0747f0e-7a35-46e2-

        label 为用户指定的 label 或自动生成的 label。Label 是该 Insert Into 导入作业的标识。每个导入作业,都有一个在单 database 内部唯一的 Label。

        status 表示导入数据是否可见。如果可见,显示 visible,如果不可见,显示 committed。

        txnId 为这个 insert 对应的导入事务的 id。

        err 字段会显示一些其他非预期错误。

        当需要查看被过滤的行时,用户可以通过如下语句

        show load where label="xxx";

        返回结果中的 URL 可以用于查询错误的数据,具体见后面 查看错误行 小结。

        数据不可见是一个临时状态,这批数据最终是一定可见的

        可以通过如下语句查看这批数据的可见状态:

        show transaction where id=4005;

        返回结果中的 TransactionStatus 列如果为 visible,则表述数据可见。

      2. affa-13a235f4020d', 'status':'committed', 'txnId':'4005'} {'label':'my_label1', 'status':'visible',
      3.  'txnId':'4005', 'err':'some other error'}
      4. {'label':'insert_8510c568-9eda-4173-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}
        
        mysql> insert into tbl1 with label my_label1 select * from tbl2; Query OK, 4 rows affected (0.38 sec)
      5.  {'label':'my_label1', 'status':'visible', 'txnId':'4005'}
        
        mysql> insert into tbl1 select * from tbl2; Query OK, 2 rows affected, 2 warnings (0.31 sec) 
      6. {'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}
        
        mysql> insert into tbl1 select * from tbl2; Query OK, 2 rows affected, 2 warnings (0.31 sec) 
      7. {'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'committed', 'txnId':'4005'}
    3. 执行失败

      执行失败表示没有任何数据被成功导入,并返回如下:

      mysql> insert into tbl1 select * from tbl2 where k1 = "a"; ERROR 1064 (HY000): all partitions have no 

      其中 ERROR 1064 (HY000): all partitions have no load data 显示失败原因。后面的 url 可以用于查询错误的数据:

      show load warnings on "url";

      可以查看到具体错误行。

    4. load data. url: http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_
    5. ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2
  2. 超时时间

    INSERT 操作的超时时间由 会话变量 query_timeout 控制。默认为5分钟。超时则作业会被取消。

  3. Label 和原子性

    INSERT 操作同样能够保证导入的原子性,可以参阅 导入事务和原子性 文档。

    当需要使用 CTE(Common Table Expressions) 作为 insert 操作中的查询部分时,必须指定 WITH LABEL 和 column 部分。

  4. 过滤阈值

    与其他导入方式不同,INSERT 操作不能指定过滤阈值(max_filter_ratio)。默认的过滤阈值为 1,即素有错误行都可以被忽略。

    对于有要求数据不能够被过滤的业务场景,可以通过设置 会话变量 enable_insert_strict 为 true 来确保当有数据被过滤掉的时候,INSERT 不会被执行成功。

  5. 性能问题

    不见使用 VALUES 方式进行单行的插入。如果必须这样使用,请将多行数据合并到一个 INSERT 语句中进行批量提交。

相似文档
  • RESTORE Description: 该语句用于将之前通过 BACKUP 命令备份的数据,恢复到指定数据库下。 该命令为异步操作。提交成功后,需通过 SHOW RESTORE 命令查看进度。 仅支持恢复 OLAP 类型的表。
  • ROUTINE LOAD Description: 例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 PALO 中。 目前仅支持通过无认证或者 SSL 认证方式,从 Kakfa 导入 CSV 或 Json 格式的数据。
  • SELECT INTO OUTFILE Description: 该命令用于将 SQL 产出的结果集导出到本地磁盘,或通过 Broker 导出到远端存储上。 query_stmt INTO OUTFILE "file_path" [format_as] [properties]
  • STREAM LOAD Description: Stream Load 通过 HTTP 协议向 PALO 传输并导入数据。该方式主要用户本地数据的上传的导入。但其本质上是一种导入框架,其提供的 HTTP 接口,不仅能够支持本地数据的传输,也能够支持内存数据、管道数据等向 HTTP 端口传输数据。
  • SHOW ALTER TABLE MATERIALIZED VIEW Description: 该命令用于查看通过 CREATE-MATERIALIZED-VIEW 语句提交的创建物化视图作业的执行情况。 该语句等同于 SHOW ALTER TABLE ROLLUP;
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部