远方

远方的山水虽遥远,却在心中永驻,像一首美妙的乐曲,让人心醉神迷。

MySQL LOAD DATA Statement

数据库 0 评 21 度

有时候会有一种需求就是批量往数据库插入及其大量的数据,比如100w条数据或者1000w条数据。
这种需求通常出现在数据库的迁移等情况下
此时,如果我们还是用原始的

INSERT INTO 表名 (字段1,字段2,字段3) VALUES (值1,值2,值3);

这种方式,或者循环一次批量插入N条数据的方式,速度会很慢。
这时MySQL官方提供了一种更加高效的插入方式LOAD DATA
具体的使用语法是

LOAD DATA
    [LOW_PRIORITY | CONCURRENT] [LOCAL]
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number {LINES | ROWS}]
    [(col_name_or_user_var
        [, col_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT}
        [, col_name={expr | DEFAULT}] ...]

比如结合这个LOAD DATA INFILE的语法文档,下面给出一个示例:

LOAD DATA INFILE '/path/to/file.csv'
REPLACE INTO TABLE `table_name` CHARACTER SET `utf8mb4`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS
(column1, column2, @var1, column3)
SET column4 = CONCAT(column2, '-', @var1, '-', column3);

在这个示例中,

  • /path/to/file.csv是要导入的CSV文件的路径。
  • REPLACE INTO TABLE命令将重复记录替换为新值。
  • CHARACTER SET指定文件中使用的字符集。
  • FIELDS TERMINATED BY指定了CSV文件中字段之间的分隔符(该示例中为,)。
  • LINES TERMINATED BY指定了每行数据后的结束符。
  • IGNORE 1 ROWS命令将忽略文件中的第一行,通常为标题行。
  • (column1, column2, @var1, column3)指定要将数据插入到哪些列中,并将变量指定为@var1。
  • SET column4 = CONCAT(column2, '-', @var1, '-', column3)利用计算的值插入到column4列。
无所谓,我会出手