如何根据主键仅在不存在的情况下插入记录? (与查询本身而不是 table 相比)

How to insert record only if not exist based on primary key? (comparing with query itself instead of table)

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

我无权创建新的 table。由于系统已经在使用中,所以不可能清除 table 并再次转储。由于之前 table 的转储看起来像这样:

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

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

你试过了吗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`

ignore 关键字添加到 insert 语句:

insert ignore into ...

If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row is discarded and no error occurs. Ignored errors generate warnings instead.

另一种方法是将数据恢复到不同的 table 并使用 insert ... select ... 和左连接并且在 where 子句中为 null 以仅将不存在的数据插入到主要 table.