You need to enable JavaScript to run this app.
文档中心
ByteHouse云数仓版

ByteHouse云数仓版

复制全文
DML
插入语句 (INSERT)
复制全文
插入语句 (INSERT)

向表中添加数据。

INSERT INTO

您可以使用基础的INSERT INTO语句写入数据。

注意

当使用唯一键表进行 insert 时,默认会实现 upsert 语义,即保留每个唯一键的最新值。

语法

  • 通用语法

    INSERT INTO [TABLE] [tableIdentifier] [columnsClause] VALUES
    
  • 设置写入数据格式
    数据可以以 ByteHouse 支持的格式传递给 INSERT。

    INSERT INTO [TABLE] [tableIdentifier] [columnsClause] FORMAT format_name
    

示例

  • 示例1:通用写入

    --step1: create a tableCREATE TABLE 
    example_table
    (
        a Int8,
        b String,
        c Date
    )
    ENGINE = CnchMergeTree
    ORDER BY (a)
    --step2: insert 2 rows into the table
    INSERT INTO example_table VALUES (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27')
    
  • 示例2:设置写入数据格式

    -- step 1: create a table
    CREATE TABLE `example_table`
    (
        `a` Int8,
        `b` String,
        `c` Date
    )
    ENGINE = `CnchMergeTree`
    ORDER BY (`a`) 
    
    -- step 2: insert 2 rows in value format into the table
    INSERT INTO example_table FORMAT VALUES (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27');
    

INSERT SELECT

插入 SELECT 查询的结果。列按照它们在 SELECT 子句中的位置进行映射。然而,它们在 SELECT 表达式和 INSERT 表中的名称可能不同。如有必要,会进行类型转换。
语法

INSERT INTO [TABLE] [tableIdentifier] [columnsClause] [selectUnionStmt]

示例

INSERT INTO example_table SELECT * FROM example_table

INSERT INFILE

从文件向表中插入数据。仅限于 gateway-client
支持的文件格式:

  • .csv
  • .json
  • .avro
  • .parquet

语法

INSERT INTO [TABLE] [tableIdentifier] [columnsClause] [FORMAT format_name] INFILE filepath

示例

INSERT INTO my_table FORMAT csvwithnames INFILE '/Users/my_name/Downloads/ETH-USD.csv'

INSERT OVERWRITE

该语句的功能是重写表或表的某些分区。

  • 重写为原子性操作
  • 分区替换时会自动过滤不符合指定分区的导入数据

语法

INSERT OVERWRITE TABLE table_name
[ PARTITION (p1, ... | *) ]
[ (COLUMN [, ...]) ]
{ VALUES ([, ...] ), ([, ...]) | QUERY }

参数

  • table_name: 需要重写的目标表名
  • PARTITION:需要重写的分区
    • 可以为 partition id 或者 partition tuple
    • 可以为一个或者多个,使用逗号分隔
    • 最外层需要使用括号
    • 不写 partition 字段则为整表重写
  • COLUMN: 需要写入目标表的列
    • 可以为一个或者多个,使用逗号分隔
    • 最外层需要使用括号
  • VALUES:需要写入的值列表
  • QUERY:需要写入的查询query

示例
单分区键的分区重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (1) SELECT * FROM test.insert_overwrite_s WHERE d = 1;

单分区键的分区VALUES重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (2) VALUES (2,6), (3,3);

单分区键的多分区重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (1,2) SELECT * FROM test.insert_overwrite_s;

多分区键的多分区重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (('1',1), ('2',2)) SELECT * FROM test.insert_overwrite_s;

多分区键指定列的导入重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (('1',1)) (s,d,n) SELECT s,d,n FROM test.insert_overwrite_s;

使用Partition ID的分区重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (ID '2f4b47c7cb10a88d637501e1a15cbb47') SELECT * FROM test.insert_overwrite_s;

使用Partition ID的多分区重写

INSERT OVERWRITE test.insert_overwrite_t PARTITION (ID '2f4b47c7cb10a88d637501e1a15cbb47', ID 'fe7805ebd452ed4c738bdbbab09c6617') SELECT * FROM test.insert_overwrite_s;

整表重写

INSERT OVERWRITE test.insert_overwrite_t SELECT * FROM test.insert_overwrite_s;

INSERT THROW

唯一键表支持 insert throw 语义,检查唯一键是否已经存在,如果存在则写入报错。

注意

仅唯一键表支持使用INSERT THROW。

-- example table
CREATE TABLE mysql_test(
    `a` Int32,
    `b` Nullable(Int32)
)
ENGINE = CnchMergeTree
ORDER BY a
UNIQUE KEY a

:) insert into mysql_test values (1, 1);
:) select * from mysql_test;
┌─a─┬─b─┐
│ 1 │ 1 │
└───┴───┘

:) insert into mysql_test FORMAT Values SETTINGS dedup_key_mode='throw' (1,1);

DB::Exception: Found duplication when insert with setting dedup_key_mode=DedupKeyMode::THROW

INSERT IGNORE

唯一键表支持 insert ignore 语义,如果唯一键已经存在,则忽略当前写入的新数据。

注意

仅唯一键表支持使用INSERT IGNORE。

-- example table
CREATE TABLE mysql_test(
    `a` Int32,
    `b` Nullable(Int32)
)
ENGINE = CnchMergeTree
ORDER BY a
UNIQUE KEY a

:) insert into mysql_test values (1, 1);
:) select * from mysql_test;
┌─a─┬─b─┐
│ 1 │ 1 │
└───┴───┘

:) insert ignore into mysql_test values (1,2);
:) select * from mysql_test;
┌─a─┬─b─┐
│ 1 │ 1 │
└───┴───┘
1 rows in set.
最近更新时间:2025.02.07 18:00:36
这个页面对您有帮助吗?
有用
有用
无用
无用