ToB企服应用市场:ToB评测及商务社交产业平台
标题:
[MySQL][表的束缚][一][空属性][默认值][列描述][zerofill]详细讲解
[打印本页]
作者:
王國慶
时间:
2024-7-23 12:55
标题:
[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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4