You need to enable JavaScript to run this app.
导航
插入语句 (INSERT)
最近更新时间:2025.02.07 18:00:36首次发布时间:2024.11.01 11:00:45
我的收藏
有用
有用
无用
无用

向表中添加数据。

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.