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