2015-04-02 65 views
0

由於應用程序找不到所需的數據,我不得不昨天恢復表內容。 在檢查發生了什麼後,我們發現了一個非常可怕的情景。 開發團隊的意思是刪除表中的特定帖子並執行下面的查詢。informix中的可怕子查詢

delete from table_3 where table2_id in (
    select table2_id from table2 
    where table1_id in (500, 557, 256, 158, 598, 601) 
); 

這導致刪除了table3中的所有帖子。 雖然表2中的主鍵名爲id而不是table2_id,但查詢中存在錯誤。 正確的查詢應該如下所示。

delete from table_3 where table2_id in (
    select id from table2 
    where table1_id in (500, 557, 256, 158, 598, 601) 
); 

總結。 當試圖分別執行有故障的子查詢時,它會正確地拋出一個錯誤,即表2中沒有名爲table2_id的列,但執行整個查詢時不會拋出錯誤,並且刪除了表3中的所有帖子。

如果子查詢出現錯誤,它在執行整個查詢時不應該拋出錯誤嗎?

回答

0

唯一可怕的是你的開發者。

他們的查詢作爲一個整體的行爲應該完全一樣。沒有錯誤,服務器也不應該提出錯誤。

子查詢從外部表中返回一個值,因爲這是編碼的內容。

也許他們應該使用行業標準命名約定id作爲每個表的主鍵列。

+1

I.e. 「從table_3中刪除where table2_id in(select table_3.table2_id from table2 ...」is executed! – jarlh 2015-04-02 11:36:36

+0

我意識到同樣的事情,當我再次看看查詢時 我沒有與外部查詢中的表進行連接首先。 – 2015-04-02 11:53:01