【问题标题】:Get id of records updated with ON DUPLICATE KEY UPDATE获取使用 ON DUPLICATE KEY UPDATE 更新的记录的 ID
【发布时间】:2022-07-10 02:34:44
【问题描述】:

我想知道是否有办法获取使用ON DUPLICATE KEY UDATE 更新的记录 ID。

例如,我的users 表具有以下架构:

CREATE TABLE `users` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx-users-email` (`email`)
);

并插入一些用户:

INSERT INTO users (email, username) VALUES ("pioz@example.org", "pioz"),("luke@example.org", "luke"),("mike@example.org", "mike");

结果是:

+----+------------------+----------+
| id |      email       | username |
+----+------------------+----------+
|  1 | pioz@example.org | pioz     |
|  2 | luke@example.org | luke     |
|  3 | mike@example.org | mike     |
+----+------------------+----------+

现在我想知道是否可以通过如下查询获得更新记录的 ID:

INSERT INTO users (email, username) VALUES ("luke@example.org", "luke2"),("mike@example.org", "mike2") ON DUPLICATE KEY UPDATE username=VALUES(username);

在此示例中,ID 为 2 和 3。

【问题讨论】:

标签: mysql sql upsert


【解决方案1】:

似乎唯一的解决方案是使用存储过程。这是一行的示例,可以展开。
有关架构和测试,请参阅下面的 dbFiddle 链接。

CREATE PROCEDURE add_update_user(IN e_mail VARCHAR(25), IN user_name VARCHAR(25) )
BEGIN
    DECLARE maxB4 INT DEFAULT 0;
    DECLARE current INT DEFAULT 0;
    
    SELECT MAX(ID) INTO maxB4 FROM users;
    INSERT INTO users (email, username) VALUES 
       (e_mail, user_name) 
       ON DUPLICATE KEY UPDATE username=VALUES(username);
      
    SELECT ID INTO current FROM users WHERE email =e_mail;
    SELECT CASE WHEN maxB4 < current THEN CONCAT('New user with ID ', current, ' created')
      ELSE CONCAT('User with ID ', current, ' updated') END Report;
      /*SELECT CASE WHEn maxB4 < current THEN 1 ELSE 0 END;*/
END
call add_update_user('jake@example.com','Jake');
|报告 | | :------------------------- | |创建 ID 为 6 的新用户 |
call add_update_user('jake@example.com','Jason');
|报告 | | :--------------------- | | ID 6 的用户已更新 |

db小提琴here

【讨论】:

    【解决方案2】:

    A 计划:使用参考手册中的技术 -- 参见 LAST_INSERT_ID()

    B 计划:摆脱id 并让email 成为PRIMARY KEY

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 2014-06-23
      • 2016-08-28
      • 2014-06-05
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多