admin

更新和增加重复项上的多列

sql

我有以下查询以插入多个值,并且在重复时需要更新列

 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

价格 库存1 股票1-C 库存2 股票2-C

运行以下值将创建类似这样的行

('99', '10', 0), 
('120', 0, '12')
价格 库存1 股票1-C 库存2 股票2-C
99 10 0 0 0
120 0 0 12 0

再次运行相同的值,应在 列中 添加新值,并在 列C中 增加列

('99', '10', 0), 
('120', 0, '12')
价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个

预期结果

上面两个查询对我的代码来说是完美的,现在让我们尝试插入重复的价格

('150', '55', 0), 
  ('150', 0, '56')

由于价格没有150,所以它应该给:

价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个
150 55 0 56 0

再次运行应更新如下行:

 ('150', '10', 0), 
 ('150', 0, '10')
价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个
150 65岁 1个 66 1个

实际结果 :

但是第一次行更新为1,下次行更新为3

(‘150’,‘55’,0),(‘150’,0,‘56’)

价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个
150 55 1个 56 1个

第二次当我跑步时我会得到这样的感觉

(‘150’,‘55’,0),(‘150’,0,‘56’)

价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个
150 55 3 56 3

而如果我在多个查询中做到这一点,则效果很好

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多只股票,这就是为什么尝试优化我的代码的原因,谢谢。


阅读 193

收藏
2021-07-01

共1个答案

admin

由于这些列不可为空,因此对于不希望在语句中提供值的列,必须传递0s而不是nulls,INSERT并使用比较符0代替null

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)

结果:

价格 库存1 股票1-C 库存2 股票2-C
99 10 0 0 0
120 0 0 12 0

然后再次:

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)

结果:

价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个

然后:

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)

结果:

价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个
150 55 0 56 0

然后:

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)

结果:

价格 库存1 股票1-C 库存2 股票2-C
99 20 1个 0 0
120 0 0 24 1个
150 65岁 1个 66 1个

参见演示

2021-07-01