INSERT 语句用于向表中添加数据。本文介绍了如何使用 INSERT 插入不同类型的数据。
可使用基本查询样式插入数据。
INSERT INTO TABLE tableIdentifier [columnsClause] VALUES (v11, v12, v13), (v21, v22, v23), ...;
参数 | 是否必填 | 说明 |
|---|---|---|
TABLE tableIdentifier | 是 | 指定插入的目标表,格式为 |
columnsClause | 否 | 指定插入的目标列,格式为 |
VALUES | 是 | 其后续为需插入的具体数据,格式为 |
-- 1. 创建数据库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 创建表 DROP TABLE IF EXISTS sample_db.sample_table ON CLUSTER sample_cluster; CREATE TABLE IF NOT EXISTS sample_db.sample_table ON CLUSTER sample_cluster ( a Int8, b String, c Date ) ENGINE = MergeTree() ORDER BY a; -- 3. 在表中插入两行数据 INSERT INTO sample_db.sample_table VALUES (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27') SETTINGS max_execution_time=10; DROP TABLE IF EXISTS sample_db.sample_table ON CLUSTER sample_cluster; CREATE TABLE IF NOT EXISTS sample_db.values ON CLUSTER bytehouse_cluster_docdemo ( a Int8, b String, c Date ) ENGINE = MergeTree() ORDER BY a; -- 3. 在表中插入两行数据 INSERT INTO sample_db.values VALUES (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27');
INSERT INTO FORMAT 语句支持将数据以 ByteHouse 支持的格式插入到表。当前支持的格式可参考输入/输出格式。
INSERT INTO TABLE tableIdentifier [columnsClause] FORMAT format_name [SETTINGS key = value] (v11, v12, v13), (v21, v22, v23), ...;
参数 | 是否必填 | 说明 |
|---|---|---|
FORMAT format_name | 是 | 声明输入数据的序列化格式。format_name 需替换为具体格式标识符,该标识符定义了后续插入数据的解析规则。 |
SETTINGS | 否 | 自定义参数,用于配置数据库参数,覆盖默认设置。执行 |
-- 1. 创建数据库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 创建表 DROP TABLE IF EXISTS sample_db.sample_table ON CLUSTER sample_cluster; CREATE TABLE IF NOT EXISTS sample_db.sample_table ON CLUSTER sample_cluster ( `a` Int8, `b` String, `c` Date ) ENGINE = MergeTree() ORDER BY a; -- 3. 以 Values 样式向表插入 2 行数据 INSERT INTO sample_db.sample_table FORMAT Values (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27'); -- 添加 settings 参数 INSERT INTO sample_db.sample_table FORMAT Values SETTINGS max_execution_time = 10 (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27');
INSERT SELECT 语句将 SELECT 查询结果插入目标表。列映射完全基于位置顺序(SELECT 子句中的列顺序需与 INSERT 表结构对齐),与列名无关。系统会自动执行必要的类型转换。
INSERT INTO TABLE tableIdentifier [columnsClause] [selectUnionStmt] [SETTINGS key = value]
selectUnionStmt:指定 SELECT 查询语句。
-- 1. 创建数据库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 创建表 DROP TABLE IF EXISTS sample_db.sample_table ON CLUSTER sample_cluster; CREATE TABLE IF NOT EXISTS sample_db.sample_table ON CLUSTER sample_cluster ( a Int8, b String, c Date ) ENGINE = MergeTree() ORDER BY a; -- 3. 在表中插入两行数据 INSERT INTO sample_db.sample_table VALUES (1, 'a', '2021-07-27'), (2, 'b', '2021-07-27'); -- 4. 验证初始数据 SELECT * FROM sample_db.sample_table; -- 5. 数据翻倍(复制现有数据) INSERT INTO sample_db.sample_table SELECT * FROM sample_db.sample_table; -- 6. 验证数据翻倍结果 SELECT * FROM sample_db.sample_table;
该语句用于从服务器中的指定文件路径向表中插入数据,仅限于 ClickHouse-Client 连接。当前支持 CSV/JSON/AVRO/Parquet 文件格式。
INSERT INTO TABLE tableIdentifier [columnsClause] INFILE filepath [FORMAT format_name];
INFILE filepath:指定文件路径。
-- 1. 创建需要的库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster; -- 2. 创建示例表 CREATE TABLE IF NOT EXISTS sample_db.infile ON CLUSTER sample_cluster ( aa Int8, ab Int8, bc Int8 ) ENGINE = MergeTree ORDER BY aa; -- 3. 插入数据 INSERT INTO sample_db.infile FORMAT CSV INFILE '/data00/clickhouse/data/user_files/sample_file.csv';
该命令用于原子性地重写表或表的特定分区。执行时,系统会自动过滤不符合分区条件的数据。
INSERT OVERWRITE TABLE table_name [ PARTITION (p1, ... | *) ] [ (COLUMN [, ...]) ] { VALUES ([, ...] ), ([, ...]) | QUERY }
参数 | 是否必填 | 说明 |
|---|---|---|
table_name | 是 | 指定需要重写的目标表名。 |
PARTITION | 否 | partition 字段可指定填写具体分区(p1)或使用星号(*)表示覆盖所有分区,整个分区最外层需使用括号包裹。如果不填写 partition 字段,则默认为整表重写。 |
COLUMN | 否 | 指定需要写入目标表的列,支持设置为一个或者多个列,列最外层需使用括号包裹。指定多列时,需使用逗号分隔。 |
VALUES | 是 | 与 QUERY 二选一,指定需要写入的值列表。 |
QUERY | 是 | 与 VALUES 二选一,指定需要写入的查询 query 语句。 |
创建源表。
-- 创建库 CREATE DATABASE IF NOT EXISTS sample_db ON CLUSTER sample_cluster ENGINE=Atomic; -- 创建表 DROP TABLE IF EXISTS sample_db.insert_overwrite_s ON CLUSTER sample_cluster; CREATE TABLE sample_db.insert_overwrite_s ( s Int32, d Int32, n String ) ENGINE = MergeTree() PARTITION BY d ORDER BY s;
创建目标表,该表结构需与源表一致。
DROP TABLE IF EXISTS sample_db.insert_overwrite_t ON CLUSTER sample_cluster; CREATE TABLE sample_db.insert_overwrite_t ( s Int32, d Int32, n String ) ENGINE = MergeTree() PARTITION BY d ORDER BY s;
向源表插入数据,并验证插入是否成功。
-- 插入数据 INSERT INTO sample_db.insert_overwrite_s VALUES (1, 1, 'a'), (2, 1, 'b'), (3, 2, 'c'), (4, 2, 'd'); -- 验证数据是否成功插入 SELECT * FROM sample_db.insert_overwrite_s;
按需执行以下重写操作,重写表 insert_overwrite_t。
单分区键的分区重写
-- 单分区键的分区重写(覆盖分区 1 的数据) INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION (1) SELECT * FROM sample_db.insert_overwrite_s WHERE d = 1; -- 验证分区 1 的重写结果 SELECT * FROM sample_db.insert_overwrite_t WHERE d = 1;
单分区键的分区 VALUES 重写
-- 单分区键的分区 VALUES 重写(覆盖分区 2 的数据) INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION (2) VALUES (2, 6, 'f'), (3, 3, 'g'); -- 验证分区 2 的重写结果 SELECT * FROM sample_db.insert_overwrite_t;
单分区键的多分区重写
-- 单分区键的多分区重写 INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION (1, 2) SELECT * FROM sample_db.insert_overwrite_s; -- 验证重写结果 SELECT * FROM sample_db.insert_overwrite_t;
多分区键的多分区重写
-- 多分区键的多分区重写(覆盖分区1和2的数据) INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION (('1', 1), ('2', 2)) SELECT * FROM sample_db.insert_overwrite_s; -- 验证多分区重写结果 SELECT * FROM sample_db.insert_overwrite_t ORDER BY d, s;
多分区键指定列的导入重写
-- 多分区键指定列的导入重写 INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION (('1', 1)) (s, d, n) SELECT s, d, n FROM sample_db.insert_overwrite_s; -- 验证重写结果 SELECT * FROM sample_db.insert_overwrite_t
使用 Partition ID 的分区重写
-- 查询分区 ID SELECT DISTINCT partition_id FROM system.parts WHERE database = 'sample_db' AND table = 'insert_overwrite_s' AND active = 1; -- 使用 Partition ID 的分区重写 INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION (ID '2f4b47c7cb10a88d637501e1a15cbb47') SELECT * FROM sample_db.insert_overwrite_s; -- 验证重写结果 SELECT * FROM sample_db.insert_overwrite_t;
使用 Partition ID 的多分区重写
-- 查询分区 ID SELECT DISTINCT partition_id FROM system.parts WHERE database = 'sample_db' AND table = 'insert_overwrite_s' AND active = 1; -- 使用 Partition ID 的多分区重写 INSERT OVERWRITE sample_db.insert_overwrite_t PARTITION ( ID '2f4b47c7cb10a88d637501e1a15cbb47', ID 'fe7805ebd452ed4c738bdbbab09c6617' ) SELECT * FROM sample_db.insert_overwrite_s; -- 验证重写结果 SELECT * FROM sample_db.insert_overwrite_t;
整表重写
-- 整表重写(替换表中所有数据) INSERT OVERWRITE sample_db.insert_overwrite_t SELECT * FROM sample_db.insert_overwrite_s; -- 验证重写结果 SELECT * FROM sample_db.insert_overwrite_t;