oracle 更新,查詢語句 與約束問題



SQL> select * from Pos;


PNO        PNAME      PDESCRIPE
---------- ---------- ------------------------------------------
2001       教師       負責教學科研工作
2004       保安       負責安全工作
2007       實驗教師   負責實驗室管理維護工作
2008       圖書管理員 負責圖書館的管理


SQL> update Pos set Pno = '2009' where Pno = '2001';
update Pos set Pno = '2009' where Pno = '2001'
*
第 1 行出現錯誤:

ORA-02292: 違反完整約束條件 (SYS.SYS_C009913) - 已找到子記錄

update 和where是怎樣進行邏輯判斷的?  


難道可以理解成這樣:where後面的條件就相當於if(Pno=2001)

然後是這樣:if(Pno=2001){Pno=2009};這樣看似乎是可以,並且邏輯上是合理的。


但是從select的角度看

如scott 表中, select * from emp where dept=10; 10號部分有的不止是一個人,查詢的結果是顯示很多條數據的。

如果where deptno =10理解成if(deptno=10) 那麼語句只執行一次,結果也只能顯示一組數據。

 難道可以理解成

while(deptno=10),這樣就可以循環的輸出多條語句,上面 update Pos set Pno = '2009' where Pno = '2001';在執行該語句時,

如果一直循環的查Pno=2001,找到後就將Pno修改爲2009,然後繼續循環的查找,這時候查找條件已經變爲Pno=2009,也就是set語句也執行了。

如果再繼續執行下去

就變成了 update Pos set Pno = '2009' where Pno = '2009';,而set已經執行過了,邏輯好亂.....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章