oracle 数据库对同一个表的不同记录能不能同时修改?高手帮忙,不胜感激!!急!!

解决方案 »

  1.   

    楼主的意思是不是同时更新2个或2个以上的字段阿,如果是,下面给个参考:
    update customers a   -- 使用别名
       set    (city_name,customer_type)=(select b.city_name,b.customer_type 
                                         from   tmp_cust_city b 
                                         where  b.customer_id=a.customer_id)
       where  exists (select 1 
                      from   tmp_cust_city b
                      where  b.customer_id=a.customer_id
                     )
       注意在这个语句中,
                                       =(select b.city_name,b.customer_type 
                                         from   tmp_cust_city b 
                                         where  b.customer_id=a.customer_id
                                        )
       与
                     (select 1 
                      from   tmp_cust_city b
                      where  b.customer_id=a.customer_id
                     )
       是两个独立的子查询,查看执行计划可知,对b表/索引扫描了2遍;
       如果舍弃where条件,则默认对A表进行全表
       更新,但由于(select b.city_name from tmp_cust_city b where where  b.customer_id=a.customer_id)
       有可能不能提供"足够多"值,因为tmp_cust_city只是一部分客户的信息,
       所以报错(如果指定的列--city_name可以为NULL则另当别论):
       
    01407, 00000, "cannot update (%s) to NULL"
    // *Cause:
    // *Action:   一个替代的方法可以采用:
       update customers a   -- 使用别名
       set    city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),a.city_name)
       或者
       set    city_name=nvl((select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id),'未知')
       -- 当然这不符合业务逻辑了
      

  2.   

    我意思是我有多个客户端,如果我多个客户端同时访问服务器的一张表,同时对这张表的不同记录(就是说表的第n条记录或第x条记录,x和n是不同的,不是说字段不同,是记录不同,或者说修改的不是同一行记录)进行update.表级锁或者行级锁是数据库自己加的,还是需要我们来加??
      

  3.   

    当然可以了,那个锁不用你控制,ORACLE内部自己会控制锁的。