刚刚执行了一个数据库迁移,由于字符编码的一些事故,一些记录没有输入,我不知道哪些记录丢失了。我有前一个数据库的完整SQL转储,但是前一个数据库已关闭。
我没有创建新表的权限。由于系统已经在使用,不可能清除表并再次转储。前一个表的转储如下所示:
INSERT INTO `surveys` (`id`, `column2`, `column3`, ...., `columnN`) VALUES
(1, 'value2', 'value3', ...., 'valueN'),
(2, 'value2b', 'value3b', ..., 'valueNb'),
.................
(x, 'value2x', 'value3x', ..., 'valueNx')
如果一行有重复的主键(在本例中是id),则不更新整个块。是否有一种方法可以添加检查,以便仅将缺失的行添加到数据库中?
将ignore
关键字添加到insert语句中:
insert ignore into ...
如果使用IGNORE关键字,则在执行命令时发生错误INSERT语句被忽略。例如,如果没有IGNORE,则行复制表中已有的UNIQUE索引或PRIMARY KEY值导致重复键错误并终止语句。与IGNORE,丢弃该行,不发生错误。忽略错误生成警告。
另一种选择是将数据恢复到另一个表中,并使用insert…选择……
您试过插入…是否开启重复键更新?
INSERT INTO `surveys` (`id`, `column2`, `column3`, ...., `columnN`) VALUES
(1, 'value2', 'value3', ...., 'valueN'),
(2, 'value2b', 'value3b', ..., 'valueNb'),
.................
(x, 'value2x', 'value3x', ..., 'valueNx')
ON DUPLICATE KEY UPDATE `id`=`id`