天天看點

資料庫中字段設計與NULL值操作

      NULL值作為資料庫中的一個特殊操作值,在日常的操作中要尤其留意。如果使用不當,會在某些特定條件下,導緻SQL執行的結果集有錯誤。但是這種錯誤并非資料庫本身造成的,而是在設計中對NULL處理不當的造成的。

      一次在檢查資料庫運作報告時看到了一句SQL,和相關的研發人員溝通後知道,其需要的功能是顯示最新時間配置的某些資料。那麼我通過一個小小的模型來再現這個問題。

      首先建立一個張名為larrytest的表,有兩個字段C1和C2。建表SQL如下。

      SQL> create table larrytest(c1 number not null,c2 date);

Table created

     然後向該表插入必要的資料:

SQL> insert into larrytest values(100,to_date('20100402','yyyymmdd'));

1 row inserted

SQL> insert into larrytest values(101,to_date('20100403','yyyymmdd'));

SQL> insert into larrytest values(102,null);

SQL> insert into larrytest values(103,to_date('20100404','yyyymmdd'));

SQL> commit;

Commit complete

      這時根據需要,執行顯示C2字段時間最新(後)的C1字段資料。原本是想得到2010年4月4日對應的資料103資料。但是看執行的結果。

 SQL> select c1 from (select row_number() over    (order by c2 desc) r,c1 from larrytest) where r=1

    2    ;

                C1

         ----------

             102

      事實上卻是102,即在排序中,NULL被倒序排在了第一個,而且無論在有什麼新日期的資料被插入,這個NULL值對應的行都會永遠排在最前面。就是說執行的SQL檢索的結果集都會是錯的,隻要表中排序的字段有空(NULL)資料進入。多麼災難呀。

      對與資料庫中表的設計還是遵循盡可能少的使用NULL字段,相對嚴謹的NOT NULL要求會避免不必要的錯誤出現。當然使用預設值有時是一個不錯的選擇。另外非空(NOT NULL)會帶來較好的性能。

      空與非空是在資料庫設計中是非常小的一個問題,但是如果不加注意,卻會帶來較大的問題。