`
jianggong1987
  • 浏览: 3496 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

数据库中字段设计与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'));

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!” 博客,请务必保留此出处http://miracle.blog.51cto.com/255044/305150
分享到:
评论

相关推荐

    修改数据库的NULL值

    数据库的表经常会出现空值,制作这个EXE的目的,就是批量修改SQL数据库的的NULL值

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    oracle数据库中的对表中字段的增删改查

    NULL 博文链接:https://dampce032.iteye.com/blog/976695

    为数据库表设计可扩展的字段

    NULL 博文链接:https://iamzhongyong.iteye.com/blog/1888934

    asp.net中对数据库表插入null空值的问题

    asp.net中对数据库表插入null空值的问题

    数据库设计与优化.pdf

    以下是性能要求设计阶段需要注意的: 1.3.1 数据库逻辑设计的规范化 数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式: 第 1 规范:没有重复的组或多值的列,这是数据库设计的最低要求...

    Oracle数据库表中字段顺序的修改方法

    问题就是当设计好表结构之后,后期如果需要往表中增加字段,默认会把该字段放到表的最后,并且字段特别多而我们又想把有关联性的字段放在一起,这时就要修改字段顺序。在修改顺序之前,我们先来看看Oracle数据库表中...

    jeecms数据库设计.doc

    1、jc_acquisition CMS采集表 编号 "字段 "名称 "类型 (长度) "主键 外键 "允许 为空 "初始值 "备注 " "1 "acquisition_id " "int(11) "P " " " " "2 "site_id " "int(11) "F " " " " "3 "channel_id " "int(11) ...

    固定资产管理系统数据库设计.docx

    2.1.2表结构设计 字段名 描述 类型 长度 约束 AssetNo 资产编号 C 20 NOTNULL,PRIMARYKEY Model 资产型号 C 30 NOTNULL EquipNumber 设备序列号 C 50 NOTNULL Name 设备名称 C 100 NOTNULL Belongto 权属关系 C 20 ...

    数据库字段名转换成Java字段名

    NULL 博文链接:https://kavinhub.iteye.com/blog/1893505

    固定资产管理系统数据库设计文档.doc

    2.1.2表结构设计 "字段名 "描述 "类型 "长度 "约束 " "Model "资产型号 "C "30 "NOTNULL " "EquipNumber "设备序列号 "C "50 "NOTNULL " "Name "设备名称 "C "100 "NOTNULL " "Belongto "权属关系 "C "20 "NOTNULL ...

    执法案件管理系统-数据库设计.docx

    执法案件管理系统-数据库设计 执法案件管理系统 数据库设计 执法案件管理系统-数据库设计全文共24页,当前为第1页。 执法案件管理系统-数据库设计全文共24页,当前为第2页。 执法案件管理系统-数据库设计全文共24页...

    Oracle数据库表建立字段唯一性的方法

    NULL 博文链接:https://panshaobinsb.iteye.com/blog/1772716

    Mysql数据库设计.pdf

    Mysql数据库设计 数据库设计 MYSQL数据库设计 串转义序列 \0 NUL(ASCLL 0) \' \" \b 退格 \n 新⾏ \r 回车 \t 制表符 \\ 反斜杠 数值列类型 TINYINT 1字节 ⾮常⼩的整数 有符号值:-128⾄127 ⽆符号值:0⾄255 ...

    图书管理系统数据库表设计.docx

    数据类型 约束 备注 d_id 职务编号 int Primary Key Identity(1000,1) d_name 职务名称 nvarchar(20) Not null d_maxcount 最大借阅数量 tinyint Not Null 图书管理系统数据库表设计全文共3页,当前为第1页。...

    工作流引擎数据库表设计.docx

    WF_StepInstance 字段 类型 描述 备注 StepInstanceID int 步骤实例ID 标示 not null FlowInstanceID int 流程实例ID StepID int 步骤ID 工作流引擎数据库表设计全文共3页,当前为第3页。工作流引擎数据库表设计全文...

    BBS论坛系统数据库设计.doc

    BBS论坛系统数据库设计 0.后台用户管理(TAB_USER) "序号 "字段名称 "字段英文名 "数据类型"长度"PK(Y/N) "NULL(Y/N)"备注 " "1 "自增ID "id "int " "Y "N " " "2 "用户帐号 "usercode "varchar "20 " "N "登录用 " ...

    购物网站数据库设计.docx

    Not null 密码查询答案 Usafetycode Varchar(16) 安全码 URoleid Int Roles (roleid)外键 角色表(roles) 字段名 " 数据类型 是否为空 默认值 说明 Roleid Int Not null 主键,自动增长 Role name Varchar(20) Not ...

    Oracle数据库中对null值的排序及mull与空字符串的区别

    在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题。在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则...

    解决SQL SERVER 2008数据库表中修改字段后不能保存

    触发Update触发器sqlserver对字段的添加修改删除、以及字段的说明SQL Server中检查字段的值是否为数字的方法SQL SERVER的字段类型说明SQL Server 中调整自增字段的当前初始值sqlserver对字段出现NULL值的处理SQL ...

Global site tag (gtag.js) - Google Analytics