[MySQL][表的束缚][一][空属性][默认值][列描述][zerofill]详细讲解 ...

打印 上一主题 下一主题

主题 572|帖子 572|积分 1720


0.媒介



  • 真正束缚字段的是数据范例,但是数据范例束缚很单一,需要有一些额外的束缚,更好的包管数据的正当性,从业务逻辑角度包管数据的正确性

    • 比如有一个字段是email,要求是唯一的

  • 表中一定要有各种束缚,通过束缚,让将来插入数据库表中的数据是符合预期的

    • 束缚本质:通过技术本领,倒逼程序员,插入正确的数据
    • 反过来,站在MYSQL视角,凡是插入进来的数据,都是符合数据束缚的
    • 束缚的最终目的:包管数据的完备性和可预期性

  • 表的束缚很多,这里主要先容如下几个

1.空属性



  • 两个值:NULL(默认的)和NOT NULL(不为空)
  • 数据库默认字段根本都是字段为空,但是实际开辟时,尽大概包管字段不为空由于数据为空没办法参与运算
    1. select null;
    2. +------+
    3. | NULL |
    4. +------+
    5. | NULL |
    6. +------+
    7. select 1+null;
    8. +--------+
    9. | 1+null |
    10. +--------+
    11. |   NULL |
    12. +--------+
    复制代码
  • 示例:创建一个班级表,包罗班级名和班级所在的教室

    • 站在正常的业务逻辑中

      • 假如班级没有名字,你不知道你在哪个班级
      • 假如教室名字可以为空,就不知道在哪上课

    • 所以在计划数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是"束缚"
    1. mysql> create table myclass(
    2. -> class_name varchar(20) not null,
    3. -> class_room varchar(10) not null);
    4. mysql> desc myclass;
    5. +------------+-------------+------+-----+---------+-------+
    6. | Field      | Type        | Null | Key | Default | Extra |
    7. +------------+-------------+------+-----+---------+-------+
    8. | class_name | varchar(20) | NO   |     | NULL    |       |
    9. | class_room | varchar(10) | NO   |     | NULL    |       |
    10. +------------+-------------+------+-----+---------+-------+
    11. # 插入数据时,没有给教室数据插入失败:
    12. mysql> insert into myclass(class_name) values('class1');
    13. ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
    复制代码


2.默认值

1.是什么?



  • 默认值:某一种数据会常常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值
  • default假如设置了,用户将来插入,有具体的数据,就用用户的,没有就用默认的
    1. mysql> create table t1 (
    2. -> name varchar(20) not null,
    3. -> age tinyint unsigned default 0,
    4. -> sex char(2) default '男'
    5. -> );
    6. mysql> desc t1;
    7. +-------+---------------------+------+-----+---------+-------+
    8. | Field | Type                | Null | Key | Default | Extra |
    9. +-------+---------------------+------+-----+---------+-------+
    10. | name  | varchar(20)         | NO   |     |    NULL |       |
    11. | age   | tinyint(3) unsigned | YES  |     |       0 |       |
    12. | sex   | char(2)             | YES  |     |      男 |       |
    13. +-------+---------------------+------+-----+---------+-------+
    14. mysql> insert into t1(name) values('zhangsan');
    15. mysql> select * from tt10;
    16. +----------+------+------+
    17. | name     | age  | sex  |
    18. +----------+------+------+
    19. | zhangsan | 0    | 男   |
    20. +----------+------+------+
    21. --注意:只有设置了default的列,才可以在插入值的时候,对列进行省略
    复制代码
2.假如同时设置了NOT NULL和default会怎样?



  • default和NOT NULL并不辩论,而是相互增补的

    • 假如没有明确指定一列要插入,用的是default
    • 假如建表中,对应列默认没有设置default值,无法直接插入

  • 两个关键字束缚的东西是不同的

    • NOT NULL:当用户想插入的时候

      • 是否为NULL
      • 正当数据

    • default

      • 当用户忽略这一列的时候,使用默认值(假如设置了)
      • 假如没有设置,直接报错


  • 注意:NOT NULL和defalut一般不需要同时出现,由于default本身有默认值,不会为空

3.列描述



  • 列描述:comment,没有实际寄义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解
    1. mysql> create table t2 (
    2. -> name varchar(20) not null comment '姓名',
    3. -> age tinyint unsigned default 0 comment '年龄',
    4. -> sex char(2) default '男' comment '性别'
    5. -> );
    复制代码
  • 通过desc查看不到注释信息:
    1. mysql> desc t2;
    2. +-------+---------------------+------+-----+---------+-------+
    3. | Field | Type                | Null | Key | Default | Extra |
    4. +-------+---------------------+------+-----+---------+-------+
    5. | name  | varchar(20)         | NO   |     | NULL    |       |
    6. | age   | tinyint(3) unsigned | YES  |     | 0       |       |
    7. | sex   | char(2)             | YES  |     | 男      |       |
    8. +-------+---------------------+------+-----+---------+-------+
    复制代码
  • 通过show可以看到:
    1. mysql> show create table t2\G
    2. *************************** 1. row ***************************
    3. Table: t2
    4. Create Table: CREATE TABLE `t2` (
    5. `name` varchar(20) NOT NULL COMMENT '姓名',
    6. `age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',
    7. `sex` char(2) DEFAULT '男' COMMENT '性别'
    8. ) ENGINE=MyISAM DEFAULT CHARSET=gbk
    复制代码

4.zerofill



  • 刚开始学习数据库时,大概对数字范例背面的长度很迷茫
  • 通过show看看t3表的建表语句:
    1. mysql> show create table t3\G
    2. ***************** 1. row *****************
    3. Table: t3
    4. Create Table: CREATE TABLE `t3` (
    5. `a` int(10) unsigned DEFAULT NULL,
    6. `b` int(10) unsigned DEFAULT NULL
    7. ) ENGINE=MyISAM DEFAULT CHARSET=gbk
    复制代码
  • 可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?

    • 其实没有zerofill这个属性,括号内的数字是毫偶然义的

  • a和b列就是前面插入的数据,如下:
    1. mysql> insert into t3 values(1,2);
    2. mysql> select * from tt3;
    3. +------+------+
    4. | a    | b    |
    5. +------+------+
    6. | 1    | 2    |
    7. +------+------+
    复制代码
  • 但是对列添加了zerofill属性后,表现的结果就有所不同了。修改tt3表的属性:
    1. mysql> alter table t3 change a a int(5) unsigned zerofill;
    2. # 也可用 alter table t3 modify a int(5) unsigned zerofill;
    3. mysql> show create table t3\G
    4. *************************** 1. row ***************************
    5. Table: tt3
    6. Create Table: CREATE TABLE `tt3` (
    7. `a` int(5) unsigned zerofill DEFAULT NULL, --具有了zerofill
    8. `b` int(10) unsigned DEFAULT NULL
    9. ) ENGINE=MyISAM DEFAULT CHARSET=gbk
    复制代码
  • 对a列添加了zerofill属性,再进行查找,返回如下结果:
    1. mysql> select * from t3;
    2. +-------+------+
    3. | a     | b    |
    4. +-------+------+
    5. | 00001 | 2    |
    6. +-------+------+
    复制代码
  • 这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,假如宽度小于设定的宽度(这里设置的是5),自动填充0

    • 要注意的是,这只是末了表现的结果,在MySQL中实际存储的还是1
    • 可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表