【问题标题】:MySQL INSERT INTO ON DUPLICATE multiple keysMySQL INSERT INTO ON DUPLICATE 多个键
【发布时间】:2022-01-05 14:38:49
【问题描述】:

我有以下问题:

我有一个 MySQL 表,其中包含 id、uuid、responseId 和 response 列,其中 id 是主键。现在我想往这个表中插入值,分别更新值response,如果uuid和responseId和传入的参数一样的话。我已经想到了 INSERT INTO ... ON DUPLICATE KEY,但我的关键是 id。

有没有一种方法可以解决我的问题,而无需先声明是否存在相应的值,然后再执行第二条语句,在该语句中执行插入或更新?

【问题讨论】:

  • INSERT .. ODKU 通过 any 唯一索引检查重复违规。它可以是主要的或常规的唯一的。如果表中有多个此类索引,则任何索引违规都会触发 ODKU 操作。
  • 感谢您的回答,但 id 是唯一的唯一键。无法将其他的设置为唯一的。
  • 没有唯一键 - 没有 ODKU。它永远不会着火。使用存储过程。

标签: mysql mariadb


【解决方案1】:

正如评论中已经提到的,IODKU(又名 upsert)需要UNIQUE(uuid, responseId)

没有它,你可以接近这个:

INSERT INTO real_table
    SELECT u.*  FROM updates AS u
           LEFT JOIN real_table AS r
             ON u.uuid = r.uuid
            AND u.responseId = r.responseId
        WHERE r.uuid IS NULL;

注意:由于该对列上没有唯一索引,因此如果存在 多个 行具有相同值的那对列,该怎么办 - 无论是在 @987654323 @ 或updates

【讨论】: