新增欄位對SQL的影響

yangtingkun發表於2008-01-22

年會的路上和PINER聊天時,PINER提到的問題。

 

 

表中新增一個欄位肯定會影響現有的SQL,比如查詢語句指定了SELECT * FROM TABLE,則得到的結果就會發生變化。同樣的道理還發生在INSERT語句不寫COLUMN LIST,也會造成這個問題。

上面提到的兩種情況都是SQL編碼不嚴謹造成的,透過好的編碼風格可以避免上面問題的發生。

現在要說的這個問題,雖然也和編碼嚴謹有關,但是問題要隱蔽得多。某個表新增欄位後,可能影響到和新增欄位根本沒有任何關係業務的SQL

下面透過一個簡單的例子來說明這個問題:

SQL> CREATE TABLE T1 (ID NUMBER, NAME VARCHAR2(30), FLAG VARCHAR2(1));

表已建立。

SQL> CREATE TABLE T2 (ID NUMBER, NAME VARCHAR2(30));

表已建立。

SQL> INSERT INTO T1 VALUES (1, 'A', '1');

已建立 1 行。

SQL> INSERT INTO T2 VALUES (1, 'B');

已建立 1 行。

SQL> SELECT T1.ID, T2.NAME FROM T1, T2
  2  WHERE T1.ID = T2.ID
  3  AND T1.NAME = 'A'
  4  AND FLAG = '1';

        ID NAME
---------- ------------------------------
         1 B

上面例子中,給出的SELECT語句沒有什麼問題,但是如果這時給T2新增一個FLAG欄位:

SQL> ALTER TABLE T2 ADD FLAG VARCHAR2(1);

表已更改。

SQL> SELECT T1.ID, T2.NAME FROM T1, T2
  2  WHERE T1.ID = T2.ID
  3  AND T1.NAME = 'A'
  4  AND FLAG = '1';
AND FLAG = '1'
    *
4 行出現錯誤:
ORA-00918:
未明確定義列

現在問題出現了,T2表新增的欄位與T1FLAG欄位同名,則聯合查詢T1T2表時,沒有明確指定表資訊的FLAG列將會導致SQL分析錯誤。

這個問題比較隱蔽,不過在書寫SQL的時候依照良好的SQL編碼規範,還是可以避免問題的方式的。

 

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

相關文章