向表中添加数据。
您可以使用基础的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');
插入 SELECT 查询的结果。列按照它们在 SELECT 子句中的位置进行映射。然而,它们在 SELECT 表达式和 INSERT 表中的名称可能不同。如有必要,会进行类型转换。
语法
INSERT INTO [TABLE] [tableIdentifier] [columnsClause] [selectUnionStmt]
示例
INSERT INTO example_table SELECT * FROM example_table
从文件向表中插入数据。仅限于 gateway-client
支持的文件格式:
语法
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 TABLE table_name [ PARTITION (p1, ... | *) ] [ (COLUMN [, ...]) ] { VALUES ([, ...] ), ([, ...]) | 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。
-- 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。
-- 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.