如何根据主键不存在记录? (与查询本身而不是表比较)

时间:2016-08-25 09:58:15

标签: mysql sql database database-backups mysql-backup

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

我没有权利创建新表。由于系统已经在使用,因此无法清除表并再次转储。由于前一个表的转储如下所示:

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

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

2 个答案:

答案 0 :(得分:2)

insert ignore into ... 关键字添加到insert语句中:

fixtures.js
  

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

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

答案 1 :(得分: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`