数据库中字段设计与NULL值操作 推荐
2010-04-26 23:33
225 查看
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)会带来较好的性能。
空与非空是在数据库设计中是非常小的一个问题,但是如果不加注意,却会带来较大的问题。
一次在检查数据库运行报告时看到了一句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)会带来较好的性能。
空与非空是在数据库设计中是非常小的一个问题,但是如果不加注意,却会带来较大的问题。
相关文章推荐
- 数据库布尔型状态字段互斥性的SQL更新操作
- 设计数据库字段或者java中使用boolean型时需谨慎
- 关于数据库Varchar字段类型长度设计问题
- 对数据库字段操作的sql
- 操作数据库表中的字段(增加、删除列)
- 数据库设计指南——第二部分(设计表和字段)
- JAVA中数据库操作的各种方式与设计模式的应用
- 数据库设计方案经典推荐
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
- 数据库设计之备用字段
- 2014.4.21 数据库设计:冗余一个字段支撑一个功能的巧妙的设计
- java 操作数据库clob类型大字段
- 设计数据库字段经常会使用1,2,3来代表数据记录的状态
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- (转载)数据库设计指南----第2 部分— 设计表和字段
- “简单事务操作”数据库(NO-SQL数据库)应用系统的可扩展性设计的十条原则
- 数据库设计方法、规范与技巧(推荐)
- 数据库设计指南(二)设计表和字段
- 数据库设计方案经典推荐