Mysql 'LOAD DATA LOCAL INFILE' 根据文件指定列的值
Mysql 'LOAD DATA LOCAL INFILE' specify column's value depending on file
我陷入了一种情况,我必须从 3 个单独的大型 CSV 文件中读取数据并将其存储在 MySQL 数据库中。
csv 文件列:
total_rev,monthly_rev,day_rev
数据库 table 的列:
total_rev, monthly_rev, day_rev, from
我可以使用以下查询在我的 table 中插入数据:
LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'
INTO TABLE revenue_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(total_rev,monthly_rev,day_rev);
但我遇到了一种情况,我想在 "Load Data Local" 查询中添加硬编码参数,以根据文件添加 from 的值。
所以最后我的 table 将包含如下记录:
total_rev, monthly_rev, day_rev, from
11, 222, 333, file1
22, 32, 343, file1
11, 22, 333, file1
11, 22, 33, file22
11, 22, 33, file22
如何在上面的查询中指定文件 1、文件 22 的值?
向 LOAD DATA 语句添加一个 SET
子句,为(不幸命名的)from
列赋值:
LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'
INTO TABLE revenue_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(total_rev,monthly_rev,day_rev)
SET `from` = 'file1'
;
请注意,也可以将文件中的字段加载到用户定义的变量中and/or在 SET 子句中引用用户定义的变量。
SET @file_name = 'myfilename'
;
LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'
INTO TABLE revenue_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
( @total_rev
, @monthly_rev
, @day_rev
)
SET `total_rev` = @total_rev
, `monthly_rev` = @monthly_rev
, `day_rev` = @day_rev
, `from` = @file_name
;
如果我们想跳过文件中的字段,而不是加载到 table,我们可以使用用户定义的变量作为占位符。我们还可以在 SET 子句中使用表达式,这允许我们利用一些非常有用的 MySQL 函数进行一些操作...IFNULL、NULLIF、STR_TO_DATE、CONCAT 等
我陷入了一种情况,我必须从 3 个单独的大型 CSV 文件中读取数据并将其存储在 MySQL 数据库中。
csv 文件列:
total_rev,monthly_rev,day_rev
数据库 table 的列:
total_rev, monthly_rev, day_rev, from
我可以使用以下查询在我的 table 中插入数据:
LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'
INTO TABLE revenue_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(total_rev,monthly_rev,day_rev);
但我遇到了一种情况,我想在 "Load Data Local" 查询中添加硬编码参数,以根据文件添加 from 的值。
所以最后我的 table 将包含如下记录:
total_rev, monthly_rev, day_rev, from
11, 222, 333, file1
22, 32, 343, file1
11, 22, 333, file1
11, 22, 33, file22
11, 22, 33, file22
如何在上面的查询中指定文件 1、文件 22 的值?
向 LOAD DATA 语句添加一个 SET
子句,为(不幸命名的)from
列赋值:
LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'
INTO TABLE revenue_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(total_rev,monthly_rev,day_rev)
SET `from` = 'file1'
;
请注意,也可以将文件中的字段加载到用户定义的变量中and/or在 SET 子句中引用用户定义的变量。
SET @file_name = 'myfilename'
;
LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'
INTO TABLE revenue_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
( @total_rev
, @monthly_rev
, @day_rev
)
SET `total_rev` = @total_rev
, `monthly_rev` = @monthly_rev
, `day_rev` = @day_rev
, `from` = @file_name
;
如果我们想跳过文件中的字段,而不是加载到 table,我们可以使用用户定义的变量作为占位符。我们还可以在 SET 子句中使用表达式,这允许我们利用一些非常有用的 MySQL 函数进行一些操作...IFNULL、NULLIF、STR_TO_DATE、CONCAT 等