目录
0.前言
- 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性 - 比如有一个字段是email,要求是唯一的
- 表中一定要有各种约束,通过约束,让未来插入数据库表中的数据是符合预期的 - 约束本质:通过技术手段,倒逼程序员,插入正确的数据- 反过来,站在MYSQL视角,凡是插入进来的数据,都是符合数据约束的- 约束的最终目的:保证数据的完整性和可预期性
- 表的约束很多,这里主要介绍如下几个
1.空属性
- 两个值:NULL(默认的)和NOT NULL(不为空)
- 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算
select null;+------+| NULL |+------+| NULL |+------+select 1+null;+--------+| 1+null |+--------+| NULL |+--------+
- 示例:创建一个班级表,包含班级名和班级所在的教室 - 站在正常的业务逻辑中 - 如果班级没有名字,你不知道你在哪个班级- 如果教室名字可以为空,就不知道在哪上课- 所以在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是"约束"
mysql> create table myclass( -> class_name varchar(20) not null, -> class_room varchar(10) not null);mysql> desc myclass;+------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+-------------+------+-----+---------+-------+| class_name | varchar(20) | NO | | NULL | || class_room | varchar(10) | NO | | NULL | |+------------+-------------+------+-----+---------+-------+# 插入数据时,没有给教室数据插入失败:mysql> insert into myclass(class_name) values('class1');ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
2.默认值
1.是什么?
- 默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值
- default:如果设置了,用户将来插入,有具体的数据,就用用户的,没有就用默认的
mysql> create table t1 (-> name varchar(20) not null,-> age tinyint unsigned default 0,-> sex char(2) default '男'-> );mysql> desc t1;+-------+---------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------------------+------+-----+---------+-------+| name | varchar(20) | NO | | NULL | || age | tinyint(3) unsigned | YES | | 0 | || sex | char(2) | YES | | 男 | |+-------+---------------------+------+-----+---------+-------+mysql> insert into t1(name) values('zhangsan');mysql> select * from tt10;+----------+------+------+| name | age | sex |+----------+------+------+| zhangsan | 0 | 男 |+----------+------+------+--注意:只有设置了default的列,才可以在插入值的时候,对列进行省略
2.如果同时设置了NOT NULL和default会怎样?
- default和NOT NULL并不冲突,而是互相补充的- 如果没有明确指定一列要插入,用的是default- 如果建表中,对应列默认没有设置default值,无法直接插入
- 两个关键字约束的东西是不同的- NOT NULL:当用户想插入的时候 - 是否为NULL- 合法数据- default: - 当用户忽略这一列的时候,使用默认值(如果设置了)- 如果没有设置,直接报错
- 注意:NOT NULL和defalut一般不需要同时出现,因为default本身有默认值,不会为空
3.列描述
- 列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解
mysql> create table t2 (-> name varchar(20) not null comment '姓名',-> age tinyint unsigned default 0 comment '年龄',-> sex char(2) default '男' comment '性别'-> );
- 通过desc查看不到注释信息:
mysql> desc t2;+-------+---------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------------------+------+-----+---------+-------+| name | varchar(20) | NO | | NULL | || age | tinyint(3) unsigned | YES | | 0 | || sex | char(2) | YES | | 男 | |+-------+---------------------+------+-----+---------+-------+
- 通过show可以看到:
mysql> show create table t2\G*************************** 1. row ***************************Table: t2Create Table: CREATE TABLE `t2` (`name` varchar(20) NOT NULL COMMENT '姓名',`age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',`sex` char(2) DEFAULT '男' COMMENT '性别') ENGINE=MyISAM DEFAULT CHARSET=gbk
4.zerofill
- 刚开始学习数据库时,可能对数字类型后面的长度很迷茫
- 通过show看看t3表的建表语句:
mysql> show create table t3\G***************** 1. row *****************Table: t3Create Table: CREATE TABLE `t3` (`a` int(10) unsigned DEFAULT NULL,`b` int(10) unsigned DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=gbk
- 可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?- 其实没有zerofill这个属性,括号内的数字是毫无意义的
- a和b列就是前面插入的数据,如下:
mysql> insert into t3 values(1,2);mysql> select * from tt3;+------+------+| a | b |+------+------+| 1 | 2 |+------+------+
- 但是对列添加了zerofill属性后,显示的结果就有所不同了。修改tt3表的属性:
mysql> alter table t3 change a a int(5) unsigned zerofill;# 也可用 alter table t3 modify a int(5) unsigned zerofill;mysql> show create table t3\G*************************** 1. row ***************************Table: tt3Create Table: CREATE TABLE `tt3` (`a` int(5) unsigned zerofill DEFAULT NULL, --具有了zerofill`b` int(10) unsigned DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=gbk
- 对a列添加了zerofill属性,再进行查找,返回如下结果:
mysql> select * from t3;+-------+------+| a | b |+-------+------+| 00001 | 2 |+-------+------+
- 这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0- 要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1- 可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已
本文转载自: https://blog.csdn.net/qq_37281656/article/details/140412089
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。