我想要一个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,因此两种语言的任意组合都可以。
我已经尝试过但花费太多时间的是:
- 单一 PHP
SELECT
声明,那么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 ;