我正在寻找一种很好的方式(不做两次查询并让自己处理需要处理的竞争条件等)来执行UPDATE ... ON DUPLICATE KEY MERGE
说我有这样一张桌子:
p_key field1 field2 field3 field4
------------------------------------------------
1 1 1 4 burger
2 1 2 5 beer
p_key
是主键,并且field 1, field 2
上有唯一索引。
如果我那时运行如下的查询:
UPDATE `table`
SET field2 = 1
WHERE p_key = 2
我会收到重复的密钥错误。我希望能够编写一个类似
的查询UPDATE `table`
SET field2 = 1
WHERE p_key = 2
ON DUPLICATE KEY MERGE
field3 = SUM(field3),
field4 = 'beer'
这会导致表格现在看起来像:
p_key field1 field2 field3 field4
------------------------------------------------
1 1 1 9 beer
或者p_key
2
也可以接受(我不介意删除哪一行)。
我希望这有道理吗?我意识到MySQL中没有ON DUPLICATE KEY MERGE
这样的东西,但是如何在MySQL中实现这个结果?
谢谢!
编辑:如果有帮助,这是测试表的代码:
CREATE TABLE `table` (
`p_key` int(11) NOT NULL,
`field1` int(11) NOT NULL,
`field2` int(11) NOT NULL,
`field3` int(11) NOT NULL,
`field4` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `table` (`p_key`, `field1`, `field2`, `field3`, `field4`) VALUES
(1, 1, 1, 4, 'burger'),
(2, 1, 2, 5, 'beer');
ALTER TABLE `table`
ADD PRIMARY KEY (`p_key`),
ADD UNIQUE KEY `field1` (`field1`,`field2`);
答案 0 :(得分:0)
我想你想要这个:
INSERT INTO table(p_key, field2)
VALUES (2, 1)
ON DUPLICATE KEY
field3 = field3 + VALUES(field3),
field4 = 'beer';
我应该注意,这假设field3
的默认值为0.否则,该值始终为NULL
。或者,您可以这样做:
INSERT INTO table(p_key, field2)
VALUES (2, 1)
ON DUPLICATE KEY
field3 = COALESCE(field3, 0) + VALUES(field3),
field4 = 'beer';