比如表中有以下数据:
REPLACE INTO `table` (`a`,`value1`,`value2`)
VALUES (1,21,31),(2,22,32),(3,23,33);
a是主键现在想要批量更新成某些value1=value1+1,某些value2=value2+1
比如希望结果是 (1,22,31),(2,22,33),(3,24,34)我尝试用
REPLACE INTO `table` (`a`,`value1`,`value2`)
VALUES (1,`value1` + 1,`value2`),(2,`value1`,`value2` + 1),(3,`value1` + 1,`value2` + 1);
或者
INSERT INTO `table`(`a`,`value1`,`value2`)
VALUES (1,`value1` + 1,`value2`),(2,`value1`,`value2` + 1),(3,`value1` + 1,`value2` + 1)
ON DUPLICATE KEY UPDATE `value1`=VALUES(`value1`),`value2`=VALUES(`value2`);
都不能实现,这些操作貌似都是先把原值删除,然后重新进行复写更新的我想要批量更新某些值,这些值是在原有基础上发生变化的,我该如何写,谢谢啦

解决方案 »

  1.   

    update `table` set `value1`=`value1` + 1
      

  2.   

    delimiter $$
    create procedure p_test()
    begin
    declare i,v1,v2 int;
    set i=1;
    set v1=(select value1 from test order by value1 desc limit 1);
    set v2=(select value1 from test order by value2 desc limit 1);
    if v1 is null then
        set v1=100;
    end if;
    if v2 is null then
        set v2=200;
    end if;
    while i <= 10 do
        set v1=v1+1;
        set v2=v2+1;
        set i=i+1;
        insert into test (value1,value2) values (v1,v2);
    end while;
    end;
    $$
    delimiter ;
      

  3.   

    -- 楼主请参考这个。drop table tabx;
    create table tabx(userId int primary key ,integral1 int,integral2 INT);
     
     
    -- REPLACE INTO tabx(userId,integral1,integral2)
    -- VALUES (1,21,31),(2,22,32),(3,23,33);-- 存在1,2,3的用户,就增加100积分.不存在分别给11,21,31积分
    INSERT INTO tabx(userId,integral1,integral2)
    VALUES (1,11,12),(2,21,22),(4,31,32)
    ON DUPLICATE KEY UPDATE integral1=integral1+100,integral2=integral2+100;
    select * from tabx;
      

  4.   


    你好,我需要的是区别不同的情况,比如你例子里的100,并不需要每一行的该列都加100,这怎么办啊
    那你只能在update时,使用case when 了。
    但这样也不好吧。。
    能说出你的原始需求吗?
    INSERT INTO tabx(userId,integral1,integral2)
    VALUES (1,11,12),(2,21,22),(4,31,32)
    ON DUPLICATE KEY UPDATE 
    integral1=integral1+(case 
    when userId=1 then 100 
    when userid=2 then 200 else 0 END)
    ,integral2=integral2+100;
      

  5.   


    你好,我需要的是区别不同的情况,比如你例子里的100,并不需要每一行的该列都加100,这怎么办啊
    那你只能在update时,使用case when 了。
    但这样也不好吧。。
    能说出你的原始需求吗?
    INSERT INTO tabx(userId,integral1,integral2)
    VALUES (1,11,12),(2,21,22),(4,31,32)
    ON DUPLICATE KEY UPDATE 
    integral1=integral1+(case 
    when userId=1 then 100 
    when userid=2 then 200 else 0 END)
    ,integral2=integral2+100;

    一张月度统计表,每一行表示一家店各种商品在一小时内的库存的变动情况,一种商品一列,如果当天该店该商品有变动,就会在原有基础上+1(统计的是变动次数,不是库存变化量,比如一个人买了6瓶水,算+1,两个人各买2平水,算+2,比如这个人同时买了几种商品,就同时更新相应的几列),几百家店就几百行*30*24,做大数据统计用
    数据引用的是另一张库存表,库存有变化时,会写这张表
    我该如何表达+1这种状况呢,实在不行的话我就只能在服务器增加变量来存储这个变动次数了
      

  6.   


    你好,我需要的是区别不同的情况,比如你例子里的100,并不需要每一行的该列都加100,这怎么办啊
    那你只能在update时,使用case when 了。
    但这样也不好吧。。
    能说出你的原始需求吗?
    INSERT INTO tabx(userId,integral1,integral2)
    VALUES (1,11,12),(2,21,22),(4,31,32)
    ON DUPLICATE KEY UPDATE 
    integral1=integral1+(case 
    when userId=1 then 100 
    when userid=2 then 200 else 0 END)
    ,integral2=integral2+100;

    一张月度统计表,每一行表示一家店各种商品在一小时内的库存的变动情况,一种商品一列,如果当天该店该商品有变动,就会在原有基础上+1(统计的是变动次数,不是库存变化量,比如一个人买了6瓶水,算+1,两个人各买2平水,算+2,比如这个人同时买了几种商品,就同时更新相应的几列),几百家店就几百行*30*24,做大数据统计用
    数据引用的是另一张库存表,库存有变化时,会写这张表
    我该如何表达+1这种状况呢,实在不行的话我就只能在服务器增加变量来存储这个变动次数了我是楼主,谢谢啦