第 52.1 节:使用 LOAD DATA INFILE 加载大量数据到数据库

假设有一个文本文件 employee.txt,内容如下:

1;max;male;manager;12-7-1985
2;jack;male;executive;21-8-1990

创建用于插入的表:

CREATE TABLE employee (
    id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    sex VARCHAR(255) NOT NULL,
    designation VARCHAR(255) NOT NULL,
    dob VARCHAR(255) NOT NULL
);

使用以下查询将值插入表中:

LOAD DATA INFILE 'path/to/file/employee.txt'
INTO TABLE employee
FIELDS TERMINATED BY ';'                -- 指定分隔值的分隔符
LINES TERMINATED BY '\r\n'
(id, name, sex, designation, dob);

考虑日期格式非标准的情况:

1;max;male;manager;17-Jan-1985
2;jack;male;executive;01-Feb-1992
1000000;marta;female;accountant;25-Apr-1993

在这种情况下,可以在插入前更改 dob 列的格式:

LOAD DATA INFILE 'path/to/file/employee.txt'
INTO TABLE employee
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r\n'
(id, name, sex, designation, @dob)
SET dob = STR_TO_DATE(@dob, '%d-%b-%Y');

此 LOAD DATA INFILE 示例未涵盖所有可用功能。更多参考信息请查阅 LOAD DATA INFILE 文档。

第 52.2 节:加载包含重复数据的文件

如果使用 LOAD DATA INFILE 命令向已有数据的表填充数据,通常会因重复键导致导入失败。有几种方法可以解决此问题。

LOAD DATA LOCAL

如果服务器启用了此选项,可用于加载客户端计算机上的文件(而非服务器)。副作用是唯一值的重复行会被忽略。

LOAD DATA LOCAL INFILE 'path/to/file/employee.txt'
INTO TABLE employee;

LOAD DATA INFILE ... REPLACE

使用 REPLACE 关键字时,重复的唯一键或主键将导致现有行被新行替换。

LOAD DATA INFILE 'path/to/file/employee.txt'
REPLACE INTO TABLE employee;

LOAD DATA INFILE ... IGNORE

与 REPLACE 相反,现有行将被保留,新行被忽略。此行为类似于上面的 LOCAL。但文件不必在客户端计算机上。

LOAD DATA INFILE 'path/to/file/employee.txt'
IGNORE INTO TABLE employee;

通过中间表加载

有时忽略或替换所有重复项可能不是理想的选择。你可能需要根据其他列的内容做出决策。这种情况下,最佳选择是加载到中间表,然后从中转移。

INSERT INTO employee SELECT * FROM intermediary WHERE ...;

第 52.3 节:将 CSV 文件导入 MySQL 表

以下命令将 CSV 文件导入到具有相同列的 MySQL 表中,同时处理 CSV 的引号和转义规则。

LOAD DATA INFILE '/tmp/file.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;   -- 跳过标题行