我正在尝试将非常大的SQL (大约3700万行)导入到InnoDB表中。有大量的重复,我想要达到的是,不改变实际转储想要防止重复行插入。字段email可能有重复项。我尝试了如下:将整个转储导入到db之后,我尝试执行以下SQL:
set session old_alter_table=1;
ALTER IGNORE TABLE sample ADD UNIQUE (email);但是第二个查询工作了大约一个小时,然后我就取消了这个查询。
什么是正确的方法来摆脱重复的?
我有几个想法:
发布于 2015-10-01 15:37:23
来自.dump文件
导入时,使用-f进行“强制”:
mysql -f -p < 2015-10-01.sql这将导致导入在遇到错误后继续进行,如果在导入之前创建唯一的键约束,则在本例中非常有用。
来自.csv文件
如果使用的是“加载数据”,请使用“忽略”,例如:
LOAD DATA LOCAL INFILE 'somefile.csv' IGNORE
INTO TABLE some_db.some_tbl
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(`somefield1`,`somefield2`);根据文档
如果指定“忽略”,则将丢弃在唯一键值上复制现有行的行。
这要求您在导入之前创建唯一的键约束,该约束将在空表上快速运行。
发布于 2015-10-01 16:03:53
按以下方式编辑转储文件:
CREATE TABLE语句以在email字段中添加一个唯一的键,或者在它之后添加一个ALTER TABLE语句。INSERT INTO sample语句,并将它们更改为INSERT IGNORE INTO sample。还可以使用管道执行步骤2:
sed 's/INSERT INTO sample/INSERT IGNORE INTO sample/' sample_table.dump | mysql -u root -p sample_db如果文件太大,无法编辑以添加ALTER TABLE语句,我建议您使用--no-create-info选项创建转储到mysqldump,并在加载转储文件之前手动创建表(使用唯一的键)。
https://stackoverflow.com/questions/32891480
复制相似问题