# INSERT INTO

将数据插入表中。

INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

您可以使用 (c1, c2, c3) 指定要插入的列的列表。

例如,考虑以下表:

SHOW CREATE insert_table;
CREATE TABLE insert_table
(
    `a` Int8,
    `b` String,
    `c` Int8
)
ENGINE = MergeTree()
ORDER BY a
INSERT INTO insert_table (*) VALUES (1, 'a', 1) ;

# 插入 SELECT 的结果

要将 select 语句返回的结果作为 insert into 语句的值使用,使用以下语句:

INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...

列按照它们在 SELECT 子句中的位置进行映射。但是,它们在 SELECT 表达式和 INSERT 的表中的名称可能不同。如果需要,会执行类型转换。

例如,考虑具有以下数据的 data 表。

SELECT * FROM data
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 2 │ a │ 3 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 2 │
└───┴───┴───┘
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 3 │
└───┴───┴───┘

data 表中的数据插入 insert_table 表。

INSERT INTO insert_table (*) SELECT
    a,
    b,
    c
FROM data

查看当前 insert_table 表中的数据

SELECT *
FROM insert_table
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
└───┴───┴───┘

# 使用 INSERT INTO 和 s3 表函数

MyScale 支持 s3 表函数 (opens new window)。您可以使用 s3 表函数从与 Amazon S3 兼容的存储服务导入/导出数据。

语法

s3(path [, NOSIGN | aws_access_key_id, aws_secret_access_key] [,format] [,structure] [,compression])

参数

  • path - 存储桶 URL,带有文件路径。在只读模式下支持以下通配符:*?{abc,def}{N..M},其中 NM 是数字,'abc''def' 是字符串。有关更多信息,请参阅此处 (opens new window)
  • NOSIGN - 如果在凭据位置提供此关键字,则所有请求都不会被签名。
  • format - 文件的格式 (opens new window)
  • structure - 表的结构。格式为 'column1_name column1_type, column2_name column2_type, ...'
  • compression - 参数是可选的。支持的值:nonegzip/gzbrotli/brxz/LZMAzstd/zst。默认情况下,它会通过文件扩展名自动检测压缩。

返回值

具有指定结构的表,用于读取或写入指定文件中的数据。

# 从 S3 文件插入数据

以下是使用 s3 表函数从 S3 导入数据的示例。

创建一个用于存储数据的表。

CREATE TABLE default.myscale_categorical_search
(
    id    UInt32,
    data  Array(Float32),
    CONSTRAINT check_length CHECK length(data) = 128,
    date  Date,
    label Enum8('person' = 1, 'building' = 2, 'animal' = 3)
) ENGINE = MergeTree ORDER BY id

从 S3 文件 https://d3lhz231q7ogjd.cloudfront.net/sample-datasets/quick-start/categorical-search.csv (opens new window) 插入数据:

INSERT INTO default.myscale_categorical_search
    SELECT * FROM s3(
        'https://d3lhz231q7ogjd.cloudfront.net/sample-datasets/quick-start/categorical-search.csv',
        'CSVWithNames',
        'id UInt32, data Array(Float32), date Date, label Enum8(''person'' = 1, ''building'' = 2, ''animal'' = 3)'
    )

# 使用 Insert Into 将数据导出到 S3

s3 表函数也可以用于将数据从 MyScale 导出到 S3。

INSERT INTO FUNCTION s3(
    'https://your-s3-bucket.s3.amazonaws.com/categorical-search.parquet',
    'AWS_ACCESS_KEY_ID',
    'AWS_SECRET_ACCESS_KEY',
    'Parquet')
SELECT * FROM default.myscale_categorical_search LIMIT 1000

在上面的示例中,https://your-s3-bucket.s3.amazonaws.com/categorical-search.csv 指定了数据将被写入的 S3 存储桶中的路径。AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 参数指定了访问 S3 存储桶所需的 AWS 访问密钥和秘密密钥。Parquet 参数表示数据将以 Parquet 格式写入 S3 存储桶,并包含来自 default.myscale_categorical_search 表的前 1000 行的所有字段的内容。

如果需要导出大量数据,可以使用 MyScale 中提供的各种分区选项将数据分割并导出。在下面的示例中,我们使用 rand() 函数的模数创建了十个文件。请注意,文件名中引用了生成的分区 ID。这将导致生成十个带有数字后缀的文件,例如 categorical-search_0.parquetcategorical-search_1.parquet 等等。

INSERT INTO FUNCTION s3(
    'https://your-s3-bucket.s3.amazonaws.com/categorical-search_{_partition_id}.parquet',
    'AWS_ACCESS_KEY_ID',
    'AWS_SECRET_ACCESS_KEY',
    'Parquet')
PARTITION BY rand() % 10
SELECT * FROM default.myscale_categorical_search