You need to enable JavaScript to run this app.
导航
插入语句 (INSERT)
最近更新时间:2025.08.14 10:17:09首次发布时间:2025.05.07 15:04:15
复制全文
我的收藏
有用
有用
无用
无用

INSERT 语句用于向表中添加数据。本文介绍了如何使用 INSERT 插入不同类型的数据。

INSERT 值

可使用基本查询样式插入数据。

语法

INSERT INTO TABLE tableIdentifier [columnsClause] 
VALUES 
(v11, v12, v13),
(v21, v22, v23),
...;

参数说明

参数

是否必填

说明

TABLE tableIdentifier

指定插入的目标表,格式为 [database.]table_name

columnsClause

指定插入的目标列,格式为 (col1, col2, ...)),若省略则插入所有列。

VALUES

其后续为需插入的具体数据,格式为(val1, val2, ...),多组数据用逗号分隔。

示例

-- 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 FORMAT

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

自定义参数,用于配置数据库参数,覆盖默认设置。执行 INSERT INTO FORMAT 语句时,需确保 SETTINGS 子句位于 FORMAT 子句和待插入的数据之间,否则可能导致语句执行报错。

示例

-- 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

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;

INSERT INFILE

该语句用于从服务器中的指定文件路径向表中插入数据,仅限于 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

该命令用于原子性地重写表或表的特定分区。执行时,系统会自动过滤不符合分区条件的数据。

语法

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

参数说明

参数

是否必填

说明

table_name

指定需要重写的目标表名。

PARTITION

partition 字段可指定填写具体分区(p1)或使用星号(*)表示覆盖所有分区,整个分区最外层需使用括号包裹。如果不填写 partition 字段,则默认为整表重写。
指定需要重写的分区时,可使用 partition id 或者 partition tuple 填写。支持指定多分区,可使用逗号分隔。

COLUMN

指定需要写入目标表的列,支持设置为一个或者多个列,列最外层需使用括号包裹。指定多列时,需使用逗号分隔。

VALUES

与 QUERY 二选一,指定需要写入的值列表。

QUERY

与 VALUES 二选一,指定需要写入的查询 query 语句。

示例

  1. 创建源表。

    -- 创建库
    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;
    
  2. 创建目标表,该表结构需与源表一致。

    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;
    
  3. 向源表插入数据,并验证插入是否成功。

    -- 插入数据
    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;
    
  4. 按需执行以下重写操作,重写表 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;