我们在使用数据库的过程中,有时候因为操作失误,常常会产生一些NULL数据,从而导致一些提取信息时不可预知的问题;本文介绍两种方法来防止NULL数据的产生——Not NULL约束与默认值设定。
首先来看一个包含NULL数据的表的查询实例:
//创建表t19 mysql> create table t19(id int,dt date); //插入四行数据,最后一行仅插入id字段的数据 mysql> insert into t19 values(1,'2015-10-01'); mysql> insert into t19 values(2,'2015-10-02'); mysql> insert into t19 values(3,'2015-10-03'); mysql> insert into t19(id) values(4); //通过where筛选查询结果,不论dt大于等于2号还是小于等于2号,都没有NULL数据,但实际上NULL是真是存在的,并且id=4 mysql> select * from t19 where dt>='2015-10-02'; +------+------------+ | id | dt | +------+------------+ | 2 | 2015-10-02 | | 3 | 2015-10-03 | +------+------------+ mysql> select * from t19 where dt<='2015-10-02'; +------+------------+ | id | dt | +------+------------+ | 1 | 2015-10-01 | | 2 | 2015-10-02 | +------+------------+ //必须用is null这个特殊的判断语法才能查询到NULL数据 mysql> select * from t19 where dt<='2015-10-02' or dt is null; +------+------------+ | id | dt | +------+------------+ | 1 | 2015-10-01 | | 2 | 2015-10-02 | | 4 | NULL | +------+------------+
可能大家会觉得本例中“select * from t19”一眼就能看到NULL数据,但如果表格记录非常庞大,其中出现几个NULL就不那么容易被察觉了,这时就可以通过给字段添加Not Null约束来限制那一列的数据中,不能出现NULL数据。
● 建表时设置Not Null约束
//在数据类型后面添加not null参数即可实现 mysql> create table t20(id int not null,uname char(20) not null); //测试仅添加id列数据 mysql> insert into t20(id) values(1); //uname列并不是NULL,而是一个空字符串 mysql> select * from t20; +----+-------+ | id | uname | +----+-------+ | 1 | | +----+-------+ //可以通过where筛选直接将空字符串的记录筛选出来 mysql> select * from t20 where uname=''; //如果不给int列添加数据 mysql> insert into t20(uname) values('qingsword.com'); mysql> insert into t20(uname) values('www.qingsword.com'); //MySQL缺省的默认值是0 mysql> select * from t20; +----+-------------------+ | id | uname | +----+-------------------+ | 1 | | | 0 | qingsword.com | | 0 | www.qingsword.com | +----+-------------------+
那如果建表时忘记添加Not Null约束了怎么办,请看下面的实例;
● 给已经存在的表添加Not Null约束
//拿上面的t19表举例,有两种方法,第一种使用change参数 //语法:alter table [表名] change [旧列名] [新列名] [数据类型] not null; //change不仅仅可以给列重命名,还可以给列增加或删除某些属性 mysql> alter table t19 change id id int not null; //更加专业的修改某列参数的做法是使用modify mysql> alter table t19 modify dt date not null; //dt的第四条记录因为前面故意设置成了NULL,添加了not null约束后被自动设置成了缺省默认值 mysql> select * from t19; +----+------------+ | id | dt | +----+------------+ | 1 | 2015-10-01 | | 2 | 2015-10-02 | | 3 | 2015-10-03 | | 4 | 0000-00-00 | +----+------------+
默认值的设置同Not Null一样,在声明字段的末尾添加default属性即可,请看下面的实例:
//创建表t13,一共4列,每列都设置了Not Null约束与对应的默认值 mysql> create table t21( -> id int not null default 0, -> uname char(30) not null default '', -> gender tinyint not null default 0, -> login datetime not null default '0000-00-00 00:00:00' -> ); mysql> desc t21; +--------+------------+------+-----+---------------------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------------+------+-----+---------------------+-------+ | id | int(11) | NO | | 0 | | | uname | char(30) | NO | | | | | gender | tinyint(4) | NO | | 0 | | | login | datetime | NO | | 0000-00-00 00:00:00 | | +--------+------------+------+-----+---------------------+-------+
应该尽量避免使用NULL数据填充字段,如果暂时没有数据可以填充,建议使用默认值取代NULL,比如对一个integer的年龄字段填充-1或0作为默认值,对一个字符串字段填充一个空字符作为默认值,这样会让以后数据库的检索更加方便。
[**] 注:如文中未特别声明转载请注明出自:QingSword.COM