【警惕】強化關聯更新時where子句範圍限定意識

secooler發表於2010-06-08
如果在關聯更新的過程中沒有給出where自己進行限制,後果是什麼樣的呢?如果沒有思考過和實踐過和吃過虧的朋友們要提高警惕了。
注意,在關聯更新時,一定要制定更新的範圍,否則後果不堪設想,也許您會因此從夢中驚醒直奔機房去救火。

1.環境準備,建立兩張表T1和T2,並簡單初始化幾條資料
sec@ora10g> create table t1 (x number(10), y number(10));

Table created.

sec@ora10g> create table t2 (x number(10), y number(10));

Table created.

sec@ora10g> insert into t1 values (1,100);

1 row created.

sec@ora10g> insert into t1 values (2,200);

1 row created.

sec@ora10g> insert into t2 values (1,1111111);

1 row created.

sec@ora10g> commit;

Commit complete.

2.T1和T2表中的內容
sec@ora10g> select * from t1;

         X          Y
---------- ----------
         1        100
         2        200

sec@ora10g> select * from t2;

         X          Y
---------- ----------
         1    1111111

3.直觀、驚悚的關聯更新結果
sec@ora10g> update t1 set y = (select y from t2 where t1.x=t2.x);

2 rows updated.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select * from t1;

         X          Y
---------- ----------
         1    1111111
         2

update語句的本意是將與T2表中x列值相同的T1表中的資料進行更新,注意x等於2的列不在我們考慮的範圍,但是未帶where子句的關聯更新後的結果是那樣的讓我們無奈。
仔細想想這是為什麼呢?道理很簡單,沒有給出where子句的update語句一定會對T1表的y列的每個值進行更新,當找到與T2表匹配的記錄能夠正確更新的情況很好理解,當找不與之匹配的記錄時,無法判斷應該賦予的內容,當然只能將其置為NULL!

4.正確的關聯更新方法
很簡單,只要在update的where子句中限定住更新範圍即可。
sys@ora10g> roll backup;
Rollback complete.
sys@ora10g> select * from t1;

         X          Y
---------- ----------
         1        100
         2        200

sys@ora10g> select * from t2;

         X          Y
---------- ----------
         1    1111111

sys@ora10g> update t1 set y = (select y from t2 where t1.x=t2.x) where x in ( select x from t2);

1 row updated.

sys@ora10g> select * from t1;

         X          Y
---------- ----------
         1    1111111
         2        200

5.小結
生產資料調整的過程中在“commit;”Enter鍵按下之前一定要再三確認,防止因誤修改帶來的不必要的麻煩。
如果有條件最好在測試環境中充分測試之後再對生產資料進行調整。

Good luck.

secooler
10.06.08

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-664777/,如需轉載,請註明出處,否則將追究法律責任。

相關文章