# 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}
,其中N
,M
是数字,'abc'
,'def'
是字符串。有关更多信息,请参阅此处 (opens new window)。NOSIGN
- 如果在凭据位置提供此关键字,则所有请求都不会被签名。format
- 文件的格式 (opens new window)。structure
- 表的结构。格式为'column1_name column1_type, column2_name column2_type, ...'
。compression
- 参数是可选的。支持的值:none
,gzip/gz
,brotli/br
,xz/LZMA
,zstd/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_ID
和 AWS_SECRET_ACCESS_KEY
参数指定了访问 S3 存储桶所需的 AWS 访问密钥和秘密密钥。Parquet
参数表示数据将以 Parquet 格式写入 S3 存储桶,并包含来自 default.myscale_categorical_search
表的前 1000 行的所有字段的内容。
如果需要导出大量数据,可以使用 MyScale 中提供的各种分区选项将数据分割并导出。在下面的示例中,我们使用 rand()
函数的模数创建了十个文件。请注意,文件名中引用了生成的分区 ID。这将导致生成十个带有数字后缀的文件,例如 categorical-search_0.parquet
,categorical-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