MySQL UPSERT 没有 ON DUPLICATE KEY

2024-02-13

我想要一个UPSERT (UPDATE如果存在,则插入)在具有以下字段的 MySQL 表上:

CREATE TABLE item (
  uid int(11) NOT NULL AUTO_INCREMENT,
  timestamp int(11) NOT NULL DEFAULT '0',
  category1 int(11) NOT NULL DEFAULT '0',
  category2 int(11) NOT NULL DEFAULT '0',
  counter int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`uid`)
)

该表已投入生产使用,并且结合(timestamp,category1,category2)是为了我的INSERT唯一,但不适用于整个表格内容。这就是为什么我不能使用“关于重复键“ 特征。

为了澄清独特的问题: 属于类别 1=9 那么这是我的插入内容,并且(timestamp,category1,category2)是独特的。但该表已投入生产使用,如果类别1=1,2,则(timestamp,category1,category2)并不独特。 据我所知我无法添加UNIQUE关键,因为它会产生类别 1+2 的问题。

我需要的是这样的:

 IF (timestamp,category1,category2) exists 
     counter=existingCount + newCount
 ELSE 
     insert new record

我使用 PHP 和 MySQL,因此两种语言的任意组合都可以。

我已经尝试过但花费太多时间的是:

  • 单一 PHPSELECT声明,那么UPDATE or INSERT
  • INSERT然后一切UPDATE and DELETE重复行

感谢我现在创建的这个存储过程的答案,语法没问题,但过程不起作用:

DROP PROCEDURE IF EXISTS myUpsert;
DELIMITER |
CREATE PROCEDURE myUpsert (IN v_timestamp INT, IN v_category1 INT, IN v_category2 INT, IN v_counter INT)        
BEGIN
  DECLARE existingCounter INT;
  SELECT COUNT(counter) AS existingCounter from item 
  WHERE timestamp =v_timestamp  AND category1=v_category1 AND category2=v_category2;

  IF existingCounter=0 THEN
    INSERT INTO item (timestamp,category1,category2,counter) 
    VALUES (v_timestamp,v_category1,v_category2,v_counter);
  ELSE
    UPDATE item SET count=v_counter+existingCounter
    WHERE timestamp=v_timestamp AND category1=v_category1 AND category2=v_category2;
  END IF;
END
|
DELIMITER ;

我建议为这三列添加唯一索引:

ALTER TABLE item ADD UNIQUE(时间戳、类别 1、类别 2)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL UPSERT 没有 ON DUPLICATE KEY 的相关文章

随机推荐