王國慶 发表于 2024-7-23 12:55:21

[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]
查看完整版本: [MySQL][表的束缚][一][空属性][默认值][列描述][zerofill]详细讲解