现在需要将一张数据表中的数据复制到另外一张表中,但是在复制的过程中源表有可能增加新的数据,因此以查询、插入、删除的顺序进行操作的话有可能会删除新加进来的数据,然后以打标记的方式则会降低数据处理的效率。
是否有方法能够以剪切的方式来进行操作。

解决方案 »

  1.   

    删除数据的时候可以这样实现(a 源表,b 目标表):
    delete  from a  
            where  exists ( select 1 
                              from  a.id = b.id
                               and  其他的条件)
    也就是只删除已经copy到目标表中的数据.
      

  2.   

    假如想用程序的方式,我想,只有先LOCK了表,然后自己操作了。就算是剪切,你想,要是你出现的问题还是有,中途有人更新的话,你还不是一样,复制不到最新的数据?假如你复制的途中,有人更新的话,你想实现什么呢?更新的程序报错?更新的程序不报错?可以更新?那你的程序干什么呢?数据都被你移走了,他还更新什么呀。这个问题的出发点,都有问题。赫赫。
    INSERT INTO .... SELECT .....
    这个句子,是不是可以完成你想要得类似的功能?这样的话,可以做到数据的行锁定,其他程序更新不了的。看你到底想要什么了。
      

  3.   

    这里还有几点要说明一下
    1、源表只会有新增操作,不会出现更新的情况。
    2、另外1楼所说的select 1 是什么意思?并且目标表中不仅仅有此次操作的数据,还包含其他的数据。
    3、3楼并没有明白我所需要的。
    4、2楼所说的锁定数据表会不会对源表产生什么不良的影响?
      

  4.   

    或者有没有办法查询已经执行了删除sql但是没有提交的数据
      

  5.   

    1楼的就可以解决你的问题
    SELECT 1 和SELECT * 都一样
    EXISTS 做的是行判断而不是列判断
    1楼是意思是说只要源表中的记录在目标表中存在就把源表中的数据删除,这样就达到了剪切的效果