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已經執行過了,邏輯好亂.....