本帖最后由 temotemo 于 2011-08-18 14:10:07 编辑

解决方案 »

  1.   

    select car_id,lat,lng,decode(flag,1,0) from carInfo where flag=1;
      

  2.   


    --不就修改一个值,干嘛要取出来改完再写回去?直接update不就好了
    update carInfo set flag = 0 where flag = 1; --这样肯定不会取出已经改过的记录的
      

  3.   

    update carInfo set flag = 0 where flag = 1 ;
      

  4.   

    不好意思,可能是我表述的不是很清楚,我的意思是,每次查询取数据的时候把flag=1的数据选出来,然后我放在程序里进行处理,数据库是动态更新的,会不断有新的数据进来,新数据进来的时候flag都是1的,然后我每次查询的时候就只要flag=1的这些列的值,之前已经查询过的就把它flag置0,下次查询取数据的时候就不要取上次取过的数据了,flag相当于一个标记,就是flag=0时表示的是旧的数据,或者是上次已经取过的数据,没有取过的数据都是flag=1的;然后我的需求是,每次取完flag=1那些所有列里面的数据之后,同时将它们的flag置0,相当于做一个标记,说明这些数据已经取过了,下次我就不再取了谢谢大家帮忙啦
      

  5.   


    insert into carInfo 
    select car_id,lat,lng,decode(flag,1,0) from carInfo where flag=1;
    他的意思是update后再插回去,你这个就是update,明显不符合的!
      

  6.   

    begin tran
    select car_id,lat,lng,decode(flag,1,0) from carInfo where flag=1;
    update carInfo set flag=0 where flag=1;
    commit tran
      

  7.   

    mysql里面没有decode(flag,1,0)这个
      

  8.   

    -- 为什么要 先将 flag=1 的数据取出来,然后再将 flag=1的数据置0呢?
    -- 你的置1为0的操作,应该是更新操作,为什么像是插入操作(插入时,只是将 flag变为0了) 呢?
      

  9.   

    只有处理完,才能把flag置为0吧,直接update flag的操作放在你的处理业务逻辑中不就好了?
    取出来的时候怎么可能知道什么时候处理完呢?
      

  10.   

    lz的意思是不是取出当前表里 flag=1的所有记录进处理,然后再把取出的这些记录的flag值变成0;
      

  11.   

    把上边写的update语句放在你程序处理的最后就行了啊
      

  12.   

    噢 错了 是放在最前  业务执行出错就rollback就可以了
      

  13.   

    推荐个解决方案给楼主:-- 更改flag = 2
    update carInfo set flag = 2 where flag = 1 ;
    -- 提交防死锁
    commit;
    -- 取出所有flag = 2的数据
    select * from carinfo where flag = 2;
    /*处理数据*/
    -- 更新所有flag = 2的数据flag = 0
    update carInfo set flag = 0 where flag = 2 ;
    --提交
    commit;