註:update操作時,條件必須注意。不寫where即為更新全表,不想更新的會被賦空值。
單表更新:update tablename set col1=value where col2='value2';
多表關聯更新:update a set a.col1=(select b.col1 from b where a.col2=b.col2) where exists(select * from b where a.col2=b.col2); --exists條件必須要有,不然更新有誤
多欄位更新:update a set (a.col1,a.col2) = (select b.col1,b.col2 from b where b.col3=a.col3 and b.col4=value2) where exists (select 1 from b where b.col3=a.col3 and b.col4=value2); --同樣必須加條件,無where則為全表更新,不滿足條件的為空白。
update a set a.col1=100 將所有行全部的特定列col1更新為特定值
update a set a.col1=100 where a.col2<10 將滿足col2條件的行的col1列的值更新為特定的值
update a set a.col1=a.col1+a.col2 where a.col2<10 同一個表中的簡單計算更新
update a set a.col1=(select b.col1 from b where a.col2=b.col2)
where exists(select * from b where a.col2=b.col2) 串聯更新,將滿足a.col2=b.col2的行的a.col1更新為對應的
b.col1的值。若且唯若a=b時可以將where條件去掉。這個更新還可以這樣理解:
update a set a.col1=(select b.col1 from b where a.col2=b.col2)表示對於a中所有行滿足a.col2=b.col2
的進行更新,不滿足條件的也更新,只不過找不到對應的值,只能將空值賦之,如果此時a.col1不允許為空白那麼會報插入空值錯誤。
所以只有加上where條件,才能將a.col2<>b.col2的那些在a中的資料得以倖存不被更新為空白)。
inline view更新法就是更新一個臨時建立的視圖
update (select a.state as state_a,b.state as state_b from a,b where a.col1=b.col1 and a.col2=value) set state_a=state_b; --col1為b表的主鍵
括弧裡通過關聯兩表建立一個視圖,set中設定好更新的欄位。直觀速度快,但b的主鍵一定要在where條件中,並且是以"="來關聯被更新表,否則報錯:ora-01779:無法修改與非索引值儲存表對應的列
merge into進行多表更新:merge table1 into table2 on condition when matched then update table1 set col1=value1,col2=value2 when not matched then insert (col_list) values (value_list);
快速遊標更新法:
begin
for cr in (查詢語句) loop --迴圈
--更新語句根據查詢出來的結果集合)
end loop;
end;
oracle支援快速遊標,不需要定義直接把遊標寫到for迴圈中,方便批次更新資料。再加上rowid物理欄位,可以快速定位到要更新的記錄上。
方案
|
建議 |
標準update
|
單表更新或較簡單的語句採用使用此方案更優 |
inline view 更新法 |
兩表關聯且被更新表通過關聯表主鍵關聯的,此方案更優
|
meger into 更新法 |
兩表關聯且被更新表不是通過關聯表主鍵關聯的,此方案更優 |
快速遊標更新法 |
多表關聯且邏輯比較複雜的,此方案更優 |
本文出自 “奔跑的羚羊” 部落格,請務必保留此出處http://heshw.blog.51cto.com/5891747/1293594