博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库中字段设计与NULL值操作
阅读量:6464 次
发布时间:2019-06-23

本文共 1197 字,大约阅读时间需要 3 分钟。

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


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字段数据。原本是想得到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)会带来较好的性能。

      空与非空是在数据库设计中是非常小的一个问题,但是如果不加注意,却会带来较大的问题。

本文转自Be the miracle!博客51CTO博客,原文链接http://blog.51cto.com/miracle/305150如需转载请自行联系原作者

Larry.Yue

你可能感兴趣的文章
C# Dictionary用法总结
查看>>
SVN服务器使用(二)
查看>>
反射获取内部类以及调用内部类方法
查看>>
C语言 - pthread
查看>>
谈Linq To Sql的优劣--纯个人观点
查看>>
App里面如何正确显示用户头像
查看>>
DATAGUARD维护:从库宕机后如何恢复到管理恢复模式
查看>>
U-BOOT之一:BootLoader 的概念与功能
查看>>
我的路上
查看>>
Velocity处理多余空白和多余空白行问题
查看>>
内容开发平台(PLATFORM)
查看>>
java值传递
查看>>
判断一个数是否为素数的一个讨论(一)
查看>>
DB2与oracle有什么区别
查看>>
创建一个多级文件目录
查看>>
Picasa生成图片幻灯片页面图文教程
查看>>
js获取当前时间的前一天/后一天
查看>>
[洛谷P3978][TJOI2015]概率论
查看>>
Python字符串的格式化
查看>>
C#反射---属性
查看>>