我有以下查询以插入多个值,并且在重复时需要更新列
INSERT INTO stock (price, stock1, stock2) VALUES ('99', '10', 0), ('120', 0, '10') ON DUPLICATE KEY UPDATE stock1 = COALESCE(stock1 + VALUES(stock1), stock1), `stock1-C` = `stock1-C` + (VALUES(stock1) IS NOT NULL), stock2 = COALESCE(stock2 + VALUES(stock2), stock2), `stock2-C` = `stock2-C` + (VALUES(stock2) IS NOT NULL)
第一次运行此查询应将(+) 列 现有值添加为新值,并以1递增现有 列C的 值,让我尝试通过一些示例进行解释
以下是默认表,其中 price 是唯一列,其余列的默认值为0
运行以下值将创建类似这样的行
('99', '10', 0), ('120', 0, '12')
再次运行相同的值,应在 列中 添加新值,并在 列C中 增加列
预期结果 :
上面两个查询对我的代码来说是完美的,现在让我们尝试插入重复的价格
('150', '55', 0), ('150', 0, '56')
由于价格没有150,所以它应该给:
再次运行应更新如下行:
('150', '10', 0), ('150', 0, '10')
实际结果 :
但是第一次行更新为1,下次行更新为3
(‘150’,‘55’,0),(‘150’,0,‘56’)
第二次当我跑步时我会得到这样的感觉
而如果我在多个查询中做到这一点,则效果很好
INSERT INTO `bankvolume` (`price`, `stock1`) VALUES (100, 10) ON DUPLICATE KEY UPDATE `stock1` = COALESCE(`stock1` + VALUES(`stock1`), `stock1`), `stock1-C` = `stock1-C` + (VALUES(`stock1`) IS NOT NULL); INSERT INTO `bankvolume` (`price`, `stock2`) VALUES (100, 10) ON DUPLICATE KEY UPDATE `stock2` = COALESCE(`stock2` + VALUES(`stock2`), `stock2`), `stock2-C` = `stock2-C` + (VALUES(`stock2`) IS NOT NULL);
我想将两者合并为一个,
附:我一次查询中要更新50多只股票,这就是为什么尝试优化我的代码的原因,谢谢。
由于这些列不可为空,因此对于不希望在语句中提供值的列,必须传递0s而不是nulls,INSERT并使用比较符0代替null:
0
null
INSERT
INSERT INTO stock (price, stock1, stock2) VALUES ('99', '10', 0), ('120', 0, '12') ON DUPLICATE KEY UPDATE `stock1-C` = `stock1-C` + (VALUES(stock1) <> 0 AND stock1 <> 0), stock1 = stock1 + VALUES(stock1), `stock2-C` = `stock2-C` + (VALUES(stock2) <> 0 AND stock2 <> 0), stock2 = stock2 + VALUES(stock2)
结果:
然后再次:
然后:
INSERT INTO stock (price, stock1, stock2) VALUES ('150', '55', 0), ('150', 0, '56') ON DUPLICATE KEY UPDATE `stock1-C` = `stock1-C` + (VALUES(stock1) <> 0 AND stock1 <> 0), stock1 = stock1 + VALUES(stock1), `stock2-C` = `stock2-C` + (VALUES(stock2) <> 0 AND stock2 <> 0), stock2 = stock2 + VALUES(stock2)
INSERT INTO stock (price, stock1, stock2) VALUES ('150', '10', 0), ('150', 0, '10') ON DUPLICATE KEY UPDATE `stock1-C` = `stock1-C` + (VALUES(stock1) <> 0 AND stock1 <> 0), stock1 = stock1 + VALUES(stock1), `stock2-C` = `stock2-C` + (VALUES(stock2) <> 0 AND stock2 <> 0), stock2 = stock2 + VALUES(stock2)
参见演示。