有时候会有一种需求就是批量往数据库插入及其大量的数据,比如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列。