【警惕】強化關聯更新時where子句範圍限定意識
如果在關聯更新的過程中沒有給出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 --
注意,在關聯更新時,一定要制定更新的範圍,否則後果不堪設想,也許您會因此從夢中驚醒直奔機房去救火。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript 拖拽限定範圍JavaScript
- JavaScript 限定範圍的拖拽效果JavaScript
- JavaScript 限定範圍拖動效果JavaScript
- MySQL最佳化WHERE子句(轉)MySql
- Elasticsearch聚合學習之三:範圍限定Elasticsearch
- div拖動範圍限定在指定元素內
- MySQL怎樣最佳化WHERE子句(轉)MySql
- SQLite中的WHERE子句SQLite
- jQuery Validate限定輸入數字大小的範圍jQuery
- SQL中 where 子句和having子句中的區別SQL
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- MyBatis中的<where>標籤和where子句的區別MyBatis
- SQL優化] 避免在WHERE子句中對列使用函式SQL優化函式
- 詳解MySQL中WHERE子句的用法MySql
- 【EXPDP】使用expdp的QUERY引數限定備份資料的範圍
- python - 生成時間範圍Python
- 更新關聯資料初始化
- 可以限定拖動範圍的彈出視窗效果程式碼例項
- MySQL-WHERE子句 以及 邏輯操作符MySql
- ORACLE SQL開發where子句之case-whenOracleSQL
- Oracle日期時間範圍查詢Oracle
- uniapp 周選擇範圍時間APP
- Win10創意者更新更具人性化:更新不強制重啟Win10
- 強制SQL在限定時間內返回結果SQL
- 強化資料風險意識 提升社會“安全感”
- MongoDB範圍查詢的索引優化MongoDB索引優化
- Bulletproof範圍證明之最佳化
- truncate和不帶where子句的delete, 以及drop區別delete
- 【實驗】where子句的解析順序及執行效率
- mysql 關聯更新刪除不走索引優化MySql索引優化
- SAP SD基礎知識之信用控制範圍
- 公司公司程式碼業務範圍成本控制範圍概念
- Oracle中where子句中條件的物理執行順序Oracle
- 國內SOA大範圍應用尚需時日
- 騰訊關聯公司成立新公司,經營範圍含動漫遊戲開發等遊戲開發
- 隨機範圍小數和隨機範圍整數隨機
- CDGA|資料治理落地化,需要強化人員資料合規意識與能力
- 關於強化學習需要了解的知識強化學習