資料庫中欄位設計與NULL值操作

2021-09-21 21:55:40 字數 1571 閱讀 6504

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

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

首先建立乙個張名為larrytest的表,有兩個欄位c1和c2。建表sql如下。

sql> 

create

table larrytest(c1 number 

notnull,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'));

1 row inserted

sql> 

insert

into larrytest 

values(102,

null);

1 row inserted

sql> 

insert

into larrytest 

values(103,to_date(

'20100404',

'yyyymmdd'));

1 row inserted

sql> 

commit;

commit complete

這時根據需要,執行顯示c2字段時間最新(後)的c1欄位資料。原本是想得到2023年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)會帶來較好的效能。

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

本文**

larry.yue

資料庫中欄位設計與NULL值操作

null值作為資料庫中的乙個特殊操作值,在日常的操作中要尤其留意。如果使用不當,會在某些特定條件下,導致sql執行的結果集有錯誤。但是這種錯誤並非資料庫本身造成的,而是在設計中對null處理不當的造成的。一次在檢查資料庫執行報告時看到了一句sql,和相關的研發人員溝通後知道,其需要的功能是顯示最新時...

資料庫設計字段 null備註

在工作中,設計資料庫難免會出現各種缺陷,例如產生null欄位,這種缺陷有時候很有可能造成一些陷阱 例如 1.在利用not in查詢時無論在mssql還是mysql中都會產生資料庫不準確的資訊。2.大量浪費空間字段,造成資料庫的空間浪費 3.如果字元型的東西,最好設計為 字串,因為在查詢的時候 str...

c 中處理資料庫中字段值的Null問題

當資料表的字段值允許為空時,若在插入資料時沒提供數值,則值就會預設是null,這個null和空字串 以及0都不同,null表示 不知道 例如 select 1 0的結果是1,而select 1 null的結果是null select aa 的結果是 aa 而select aa null的結果是nul...