前几天在CSDN里看到
交换表内两列数据的方法,
update table table_name set col1=col2,col2=col1;
觉得很好(现在找不到了,呵呵),只是不知道其中的原理,col1中的值不是被覆盖了吗,怎么还能实现交换呢?不解,

解决方案 »

  1.   

    因为oracle一致性读的原则下,是不会出现这种情况了,并且所有的dml操作并不是马上就影响当前值,而在在你commit之后才影响到.因此你的这个担心是毫无必要的.
      

  2.   

    在执行update里,它的原值未被覆盖,等号左边相当于一个变量被临时存放;
    这就是既有原值,以又变量,所以它能够更新;
      

  3.   

    在执行update里,它的原值未被覆盖,等号左边相当于一个变量被临时存放;
    这就是既有原值,以又变量,所以它能够更新;
      

  4.   

    建议楼上们都了解一下redo和undo,就明白这个问题的道理了.
      

  5.   

    我是这样理解的:
    set col1=col2时,
    第一步:把col1的值放到回滚段,
    第二步:用col2的值覆盖col1原来的空间col2=col1时,(此时不会去访问回滚段,因为是同一事务,且没有rollback);
    因为此时col1的空间存放的是col2的值,所以col2的值还是col2的值(没变);
      

  6.   

    mov col1 buffer1;
    mov col2 buffer2;--此时由于未提交,col1和col2的值仍然不变,数据仅仅交换在缓冲区.
    submit;  
    mov buffer1 col2;
    mov buffer2 col1;
    --真正意义上实现了数据的交换