作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要一个 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
唯一的,但不是整个表内容。这就是我无法使用“ON DUPLICATE KEY”功能的原因。
关于 UNIQUE 问题的说明:如果 category1=9 那么这是我的插入,并且 (timestamp,category1,category2)
是唯一的。但是该表正在生产中使用,如果 category1=1,2 那么 (timestamp,category1,category2)
不是唯一的。据我所知,我不能添加 UNIQUE
键,因为它会导致类别 1+2 出现问题。
我需要的是这样的:
IF (timestamp,category1,category2) exists
counter=existingCount + newCount
ELSE
insert new record
我使用 PHP 和 MySQL,因此两种语言的任意组合都可以。
我已经尝试过但花费太多时间的是:
SELECT
语句,然后是 UPDATE
或 INSERT
INSERT
然后UPDATE
和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 (timestamp, category1, category2)
关于php - 没有 ON DUPLICATE KEY 的 MySQL UPSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639414/
我是一名优秀的程序员,十分优秀!