我正在尝试将非常大的SQL转储(大约3700万行)导入InnoDB表。有大量的重复和我想要实现的是,不改变实际转储想要防止重复行插入。字段email
可能有重复项。我尝试了以下内容:将整个转储导入db后,我尝试执行以下SQL:
set session old_alter_table=1;
ALTER IGNORE TABLE sample ADD UNIQUE (email);
但第二次查询工作大约1小时,然后我刚刚取消了这个查询。
什么是摆脱重复的正确方法?
我有几个想法:
答案 0 :(得分:0)
来自.dump文件
导入时,使用-f
进行"强制":
mysql -f -p < 2015-10-01.sql
这会导致在遇到错误后继续导入,如果在导入之前创建唯一键约束,则在这种情况下这很有用。
来自.csv文件
如果您正在使用&#34; LOAD DATA&#34;,请使用&#34; IGNORE&#34;,例如:
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`);
如果指定IGNORE,则复制唯一的现有行的行 键值被丢弃。
这要求您在导入之前创建唯一键约束,这将在空表上快速创建。
答案 1 :(得分:0)
按如下方式编辑转储文件:
修改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
,并手动创建表格(使用加载转储文件之前的唯一键。