[mysql基础文档]-15-Not NULL约束与默认值

引言

我们在使用数据库的过程中,有时候因为操作失误,常常会产生一些NULL数据,从而导致一些提取信息时不可预知的问题;本文介绍两种策略来防止NULL数据的产生——Not NULL约束与默认值设定。

文章目录

0×1.MySQL如何设置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('hk987.xyz');
                    mysql> insert into t20(uname) values('www.hk987.xyz');

                    --MySQL缺省的默认值是0
                    mysql> select * from t20;
                    +----+-------------------+
                    | id | uname             |
                    +----+-------------------+
                    |  1 |                   |
                    |  0 | hk987.xyz         |
                    |  0 | www.hk987.xyz     |
                    +----+-------------------+
                    
                    

那如果建表时忘记添加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属性,在insert into中故意给这一列插入NULL值会返回一个错误;而给存在NULL值的某列追加not null属性也会返回一个错误。

0×2.MySQL如何设置列默认值

默认值的设置同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作为默认值,对一个字符串字段填充一个空字符作为默认值,这样会让以后数据库的检索更加方便。