高分求个update的解决方案

风中云 2012-12-24 06:29:52
我这里有两个表:

我有个线程要把表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表,但是客户反映效率慢,所以这种方法就不要说了。
先在这里谢谢了
...全文
179 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
风中云 2012-12-25
  • 打赏
  • 举报
回复
谢谢大家了,首先这个客户是不让用数据库脚本解决的,然后数据库的表结构也不能改,就是我用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
            }
        }
程序中我是这样处理的,也不知道是否正确
snow-is-my-Love 2012-12-25
  • 打赏
  • 举报
回复
偷鸡 就把A表添加一个字段 B_ID insert 的时候把 B的ID 扔里面做关联,外键。就ok了
  • 打赏
  • 举报
回复
引用 5 楼 twtiyb 的回复:
insert into A(A,B,C) select top 100 a,b,1 from B where c=0
看错了。 那你还是直接用存储过程或者写脚本吧。
  • 打赏
  • 举报
回复
insert into A(A,B,C) select top 100 a,b,1 from B where c=0
yudengchang 2012-12-25
  • 打赏
  • 举报
回复
[quote=引用 2 楼 hucp2007 的回复:] 正解
beiouwolf 2012-12-25
  • 打赏
  • 举报
回复

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 #tmp

commit tran
手打的 没测试 自己纠一下错
风中云 2012-12-25
  • 打赏
  • 举报
回复
thanku了,现在问题已经解决了
笑莫问 2012-12-24
  • 打赏
  • 举报
回复
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表的。
leandzgc 2012-12-24
  • 打赏
  • 举报
回复
起事物啊,在事务中对表的操作都是同样的,也就是你可以把你的操作放在一个事物里面,这样就不会出现你说的那种问题了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧