Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 之update

1、根据条件更新表里的某个字段值,如下:
update test t set t.b_salary =
case when t.b_id = 5 then 5000
    when t.b_id = 6 then 6000
    when t.b_id = 7 then 7000
end
where t.b_id in (5,6,7)
说明: where条件部分一定要把记录限制为只需要更新的部分,否则其他部分会被更新为空。
2、2表关联update某个字段的
a)、一对一关联
update test1 t set t.a_salary =
( select a.b_salary from test a where a.b_id = t.a_id

where exists (select 1 from test a where a.b_id = t.a_id )
;
commit;
b)、一对多关联
(1)、目标表一个ID存在多条记录,源头是一个ID存一条记录,此种场景和一对一没有区别
update test1 t set t.a_salary =
( select a.b_salary from test a where a.b_id = t.a_id

where exists (select 1 from test a where a.b_id = t.a_id )
;
commit;
(2)、目标表一个ID一条记录,源头是一个ID存在多条记录
报错ora-01427 :单行子查询返回多条记录
本质上是目标表在源表根据关联ID去找的时候,一个ID找到了多条记录,返回给目标表的一条记录里目标值为多个。
若返回多个记录值都是一样的,返回任意一条都可以,则此时对返回值加上max,写法如下:
update test1 t set t.a_salary =
( select max(a.b_salary) from test a where a.b_id = t.a_id

where exists (select 1 from test a where a.b_id = t.a_id )
c)、多对多关联
报错ora-01427 :单行子查询返回多条记录
本质上是目标表在源表根据关联ID去找的时候,一个ID找到了多条记录,返回给目标表的一条记录里目标值为多个。
若返回多个记录值都是一样的,返回任意一条都可以,则此时对返回值加上max,写法如下:
update test1 t set t.a_salary =
( select max(a.b_salary) from test a where a.b_id = t.a_id

where exists (select 1 from test a where a.b_id = t.a_id )
;
commit;
说明: exists的作用,防止更新没有关联上的记录。若不加exists ,则目标表中无关记录会被置空。故这个exists一定要加上。
总结:
  1、对于更新表内容,一定要把更新内容限制在只要更新的部分,where部分一定要有。
  2、2表关联update的时候,目标表根据关联ID从源表去找记录的时候,存在ID重复的记录和目标表没有关系,要注意源表存在ID重复的记录。
 对于大表关联update,普通的写法,根本跑不动,百度了一下,根据rowid来更新,果然可以跑动。方法如下:--t1 为源表
--t2 为要更新的目标表
declare
 cursor cur is
 select
    a.t1_name, b.rowid row_id
   from t1 a, t2 b
    where a.t1_id = b.t2_id
    order by b.rowid;
 v_counter number; 
begin
 v_counter := 0;
 for row in cur loop
 update t2 t
      set t.t2_name = row.t1_name
    where rowid = row.row_id;
 v_counter := v_counter + 1;
 if (v_counter >= 1000) then
   commit;
   v_counter := 0;
 end if;
 end loop;
 commit;
end;相关阅读:Oracle update执行计划原理解析与优化 http://www.linuxidc.com/Linux/2013-11/92485.htmOracle 中 update nowait 的使用方法 http://www.linuxidc.com/Linux/2013-03/81900.htmOracle存储过程使用实例之update的使用 http://www.linuxidc.com/Linux/2013-01/78022.htmOracle update关联表的思路总结  http://www.linuxidc.com/Linux/2012-09/70746.htmOracle for update of 和 for update区别 http://www.linuxidc.com/Linux/2012-01/52922.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12Oracle之DataBase闪回Oracle 11gR2 创建无数据对象临时不分配segment相关资讯      Oracle update 
  • Oracle update和order by  (07/24/2015 10:28:59)
  • Windows 2003 从Oracle 9201   (04/24/2013 06:24:54)
  • Oracle Update执行计划原理解析与  (11/08/2013 20:47:57)
  • Oracle存储过程使用实例之update的  (01/17/2013 19:43:26)
本文评论 查看全部评论 (0)
表情: 姓名: 字数