我这里有两个表:我有个线程要把表B中字段c为0的数据添加到表A中,然后把表B的字段c更新为1
这个是我添加用的sql语句insert into A(A,B) select top 100 a,b from B where c=0
然后更新的时候我怎么更新啊,怎样才能只更新这一批添加到A表中的B表记录的c字段?
有人说直接update B set c=1,但是这样做的话,我在执行insert操作时,B表来了新数据会把这些还没有添加A表的新数据同时更新掉,会造成A表的数据不全。
请各位帮帮忙,给个解决方法,怎样才能完美的将B表的数据添加到A表。既不能重复又不能缺失数据能?
PS:我之前是先查询一批c=0的数据添加到A表,然后更新B的c为1,分为了3步,数据是能够全部不重复添加A表,但是客户反映效率慢,所以这种方法就不要说了。
先在这里谢谢了

解决方案 »

  1.   

    insert into A(A,B) select  a,b from B where c=0
    update B set c=1 where c = 0
    把上面两个作为一个事务提交
    不会产生这种情况的:在执行insert操作时,B表来了新数据会把这些还没有添加A表的新数据同时更新掉,会造成A表的数据不全,因为是先将数据拷贝到A表的。
      

  2.   


    begin tran-- 建立临时表
    create table #tmp(id int,A varchar(255),B varchar(255))
    -- 插入临时表
    insert into #tmp select top 1000 A,B from 表B where C=0
    if @@error<>0
    begin 
      rollback tran 
      return 
    end -- 更改已插入数据标记
    update 表B set 表B.C = 1 from #tmp where 表B.id = #tmp.id
    if @@error<>0
    begin 
      rollback tran 
      return 
    end -- 可以对临时数据进一步处理-- 转移数据
    insert into 表A(A,B) select A,B from #tmp
    drop table #tmpcommit tran手打的 没测试
    自己纠一下错
      

  3.   

    Quote: 引用 2 楼 hucp2007 的回复:

    正解
      

  4.   

    insert into A(A,B,C) select top 100 a,b,1 from B where c=0
      

  5.   

    偷鸡  就把A表添加一个字段  B_ID   insert 的时候把 B的ID 扔里面做关联,外键。就ok了
      

  6.   

    谢谢大家了,首先这个客户是不让用数据库脚本解决的,然后数据库的表结构也不能改,就是我用java程序要怎么解决呢,像上面1、2楼说的,我把insert和update放到了一个事物里边,但是,我测试了以下还是会缺失一部分数据。 Connection conn = abbottDataSource.getConnection();
            conn.setAutoCommit(false);
            QueryRunner qr = new QueryRunner();        //        QueryRunner qr = new QueryRunner(abbottDataSource);
            int insertRows = 0;
            int updateRows = 0;
            try {
                insertRows = qr.update(conn, sql);//insert操作
                updateRows = qr.update(conn, updateSQL);//update操作
                conn.commit();
                //            result = qr.update(sql);
            } catch (Exception e) {
                conn.rollback();
                throw new Exception("推送MO出错 sql=" + sql, e);
            } finally {
                conn.setAutoCommit(true);
                try {
                    conn.close();
                } catch (Exception e) {
                    // ignore
                }
            }程序中我是这样处理的,也不知道是否正确
      

  7.   

    thanku了,现在问题已经解决了