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