43

鉴于错误mysqldump导致导入错误:

namtar backups # mysql -p < 2010-12-01.sql
Enter password: 
ERROR 1062 (23000) at line 8020: Duplicate entry 'l�he?' for key 'wrd_txt'

有没有一种简单的方法来告诉导入跳过给定的行并继续?

(是的,我知道我可以手动编辑文件或解析输出,但这不是很方便)

4

6 回答 6

54

如果您可以再次进行转储,则可以在转储时添加--insert-ignore到命令行。

或者你可以尝试使用mysqlimport命令--force,即使遇到 MySQL 错误也会继续。

于 2011-10-01T18:56:20.423 回答
39

mysql -f -p < 2010-12-01.sql

-f(force) 是这里的操作选项,对我有用。

于 2012-04-05T13:35:32.743 回答
26

遵循 jmlsteele 的回答和评论的建议,这里是如何将插入转换为动态INSERT IGNORE

如果您从sql文件中导入:

sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" < 2010-12-01.sql | mysql -p

如果您从gz文件导入,只需将 gunzip 的输出通过管道传输到 sed,而不是使用文件输入:

gunzip < 2010-12-01.sql.gz | sed -e "s/^INSERT INTO/INSERT IGNORE INTO/" | mysql -p
于 2013-07-03T16:11:31.873 回答
3

很棒的小费。我做了一些不同但相同的结果。

perl -pi -e 's/INSERT INTO/INSERT IGNORE INTO/g' filename.sql
于 2019-02-22T10:51:54.963 回答
2

其他选项当然是可行的选项,但另一种解决方案是简单地编辑.sqlmysqldump.

改变:

INSERT INTO table_name ...

INSERT IGNORE INTO table_name ...
于 2017-03-17T14:01:31.097 回答
1

只是想你是否删除了转储顶部的 MySQL 指令?(当我在删除我已经使用 sed 命令插入的所有记录/表后重新启动还原时,我无意中这样做了)。这些指令告诉 MySQL,除其他外,不要进行唯一测试、外键测试等)

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
于 2013-03-06T13:33:13.843 回答