如何插入记录,如果不存在基于主键?(与查询本身而不是表比较)



刚刚执行了一个数据库迁移,由于字符编码的一些事故,一些记录没有输入,我不知道哪些记录丢失了。我有前一个数据库的完整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…选择……

在where子句中为null,只将不存在的数据插入到主表中。

您试过插入…是否开启重复键更新?

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`

最新更新