0.媒介
- 真正束缚字段的是数据范例,但是数据范例束缚很单一,需要有一些额外的束缚,更好的包管数据的正当性,从业务逻辑角度包管数据的正确性
- 表中一定要有各种束缚,通过束缚,让将来插入数据库表中的数据是符合预期的
- 束缚本质:通过技术本领,倒逼程序员,插入正确的数据
- 反过来,站在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:当用户想插入的时候
- 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: t2
- Create 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: t3
- Create 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: tt3
- Create 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属性后的一种格式化输出而已
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |