天天看點

用php更新oracle表,Oracle 之update

1、根據條件更新表裡的某個字段值,如下:update test t set t.b_salary =case when t.b_id = 5 then 5000 when t.b_id = 6 the

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執行計劃原了解析與優化

Oracle 中 update nowait 的使用方法

Oracle存儲過程使用執行個體之update的使用

Oracle update關聯表的思路總結

Oracle for update of 和 for update差別

用php更新oracle表,Oracle 之update

本文原創釋出php中文網,轉載請注明出處,感謝您的尊重!