0

刚刚进行了一次数据库的迁移,由于字符编码的一些意外,有些记录没有输入,不知道哪些记录丢失了。我有前一个数据库的完整 SQL 转储,但前一个数据库已关闭。

我无权创建新表。由于系统已经在使用中,不可能再次清表和转储。由于上表的转储如下所示:

INSERT INTO `surveys` (`id`, `column2`, `column3`, ...., `columnN`) VALUES
    (1, 'value2', 'value3', ...., 'valueN'), 
    (2, 'value2b', 'value3b', ..., 'valueNb'),
    .................
    (x, 'value2x', 'value3x', ..., 'valueNx')

如果一行的主键(在这种情况下为 id)重复,则不会更新整个块。有没有办法添加检查以便只将丢失的行添加到数据库中?

4

2 回答 2

2

在插入语句中添加ignore关键字:

insert ignore into ...

如果使用 IGNORE 关键字,则执行 INSERT 语句时发生的错误将被忽略。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,该行将被丢弃并且不会发生错误。忽略的错误会生成警告。

另一种选择是将数据恢复到不同的表,并使用带有左连接的insert ... select ...并且在 where 子句中为 null 以仅将不存在的数据插入到主表中。

于 2016-08-25T10:06:23.063 回答
1

您是否尝试过INSERT ... ON DUPLICATE KEY UPDATE

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`
于 2016-08-25T10:03:45.543 回答