[MySQL][表的束缚][一][空属性][默认值][列描述][zerofill]详细讲解
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: 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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]