【数据库初阶】MySQL中表的束缚(上)

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922


??博主首页:
??专栏首页: 数据库初阶
??其它专栏: C++初阶 | C++进阶 | 初阶数据结构

   亲爱的小伙伴们,各人好!在这篇文章中,我们将深入浅出地为各人讲解 MySQL中表的束缚 资助您轻松入门,快速把握焦点概念。
  假如文章对您有所启发或资助,请别忘了 点赞 ??、收藏 ??、留言 ?? 支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!
  

文章目次





    • @[toc]

  • `0. 什么是表的束缚`
  • `1. NULL & NOT NULL`


    • ??1.1 关键词解释??
    • ??1.2 用法示例??

  • `2.DEFAULT`


    • ??2.1 关键词解释??
    • ??2.2 用法示例??
    • ??2.3 NOT NULL 和 DEFAULT 区别??

  • `3.COMMENT`


    • ??3.1 关键词解释??
    • ??3.2 用法示例??

  • `4.ZEROFILL`


    • ??4.1 关键词解释??
    • ??4.2 用法示例??

  • `5. PRIMARY KEY`


    • ??5.1 关键词解释??
    • ??5.2 用法示例??


      • 5.2.1 单列主键
      • 5.2.2 复合主键


   上一篇文章中,博主先容了 :
     

  • MySQL中差别的数据类型
    建议将上一篇文章看完之后再来看这篇文章,链接如下:
     【数据库初阶】MySQL数据类型
    那么接下来正文开始:
  0. 什么是表的束缚



  • 上一篇文章中讲过,真正表的束缚其实是 数据类型
  • 但是数据类型束缚很单一,需要有一些 额外的束缚,更好的保证 数据的合法性,从业务逻辑角度 保证数据的精确性
  • 表的束缚有许多,本篇文章主要先容以下几个:

    • null / not null,
    • default,
    • comment,
    • zerofill,
    • primary key,
    • auto_increment,
    • unique key


1. NULL & NOT NULL

??1.1 关键词解释??



  • NULL 就是空,什么都没有的意思,和语言上的NULL是有点区别的;
  • 在数据库创建中,假如从逻辑角度不想让某一个字段(某一列)为空,就要添加束缚条件,NOT NULL。
??1.2 用法示例??



  • 例如,在学校中,从逻辑上讲,每个学生的学号都不可能是空值;
  • 因此可以将这个字段添加束缚 NOT NULL;
  • SQL 代码如下:
    mysql> create table if not exists null_test(
    -> stu_id varchar(10) not null,
    -> stu_name varchar(10),
    -> stu_class int
    -> );
  • 查看一下表结构,输入:desc null_test;



  • 此时,必须在这个表中的每一行添加这个字段的值,否则就会报错:


2.DEFAULT

??2.1 关键词解释??



  • 在一张表中,某一个字段的值可能 出现的频率比力高
  • 为了避免重复的输入,可以将这个字段添加束缚 DEFAULT 默认值;
  • 下次就不需要手动进行插入,会自动添加到表中;
  • 假如某一行中此字段的值不是默认值,再手动修改,大大提高了服从。
??2.2 用法示例??



  • 例如,在理工类学校中,男生的人数可能比女生的人数要多许多;
  • 那么就可以将性别这个字段添加默认值;
  • 代码如下:
    mysql> create table if not exists default_test(
    -> stu_id int not null,
    -> gender char(1) default ‘男’,
    -> age int unsigned
    -> );
    Query OK, 0 rows affected (0.05 sec)
  • 查看表结构:



  • 省略gender字段向表中插入数据,那就是默认值,不省略就可以修改:

??2.3 NOT NULL 和 DEFAULT 区别??

问题1:


  • 先来看下面的一个插入方式,为什么在创建的时间 age 字段没有设置默认值,插入的时间也可以被省略?



  • 现实上,对于不是 NOT NULL 的字段,MySQL会自动帮我们添加 默认值 NULL,我们可以查看一下MySQL为我们修改的创建表的语法:

问题2:


  • 我们可以看到:非空束缚的默认值也是NULL,为什么呢?



  • 其实这个NULL的本质是不一样的,假如我们不指定stu_id列插入数据看一下:

    • 可以看到,这里的报错是 没有默认值报的错。




  • 假如我们指定了这个列,但是插入的是空值看一下:

    • 注意到,这里的报错是 此列不能是空报的错




  • 因此,在定义非空束缚的表中,MySQL不会帮我们自动生成一个默认值;
  • 对于带有 NOT NULL 束缚的字段,DESC 中显示的 Default 为 NULL,这并不表示这个字段的默认值是 NULL。现实上,NOT NULL 束缚要求这个字段在插入时不能是 NULL,假如插入时没有提供这个字段的值,MySQL 会报错,报的是没有默认值的错误。
总结:


  • 对于是非空束缚的字段:

    • MySQL不会帮我们自动生成一个默认值,假如我们在插入数据的时间不显示指定此列,那么编译器就会报没有默认值的错误;
    • 假如插入数据的时间显示插入值,但是插入的值是NULL,才会报自此段不能为空的错误。

  • 对于不是非空束缚的字段:

    • MySQL会自动帮我们生成一个默认值NULL,所以不会报没有默认值的错误。
    • 因为只有设置了default的列,才可以在插入值的时间,对列进行省略。

  • 一般环境下,default 束缚和 not null 束缚不会一起利用。

3.COMMENT

??3.1 关键词解释??



  • comment 表示列形貌,没有现实寄义,专门用来形貌字段,会根据表创建语句保存,用来给程序员或DBA来进行了解;
??3.2 用法示例??



  • 创建一个表,形貌各个列的寄义;
  • 代码如下:
    mysql> create table if not exists comment_test(
    -> name varchar(20) not null comment ‘姓名’,
    -> age tinyint unsigned default 18 comment ‘年事’,
    -> gender char(1) default ‘男’ comment ‘性别’
    -> );
    Query OK, 0 rows affected (0.08 sec)
  • desc是查不到注释信息的:



  • 通过 show create table 可以看到:


4.ZEROFILL

??4.1 关键词解释??



  • 还记得在上一篇文章中讲的数据类型 int 吗,在查表的时间后面的数字代表着什么呢?
  • 其实没有这个zerofill属性,这个数字是没故意义的;
  • 其实这个表示最后用统一的字数显示,假如是 10 10 10,那么最后就是显示 10 10 10位数字,假如现实数字少于 10 10 10 位,就用 0 0 0 补齐,假如多出就不管。
??4.2 用法示例??



  • 创建一个表,内里只有 int,一个int(5),另一个int(10) 这个用zerofill束缚;
  • 代码如下:
    mysql> create table if not exists zerofill_test(
    -> a int(5),
    -> b int(10) unsigned zerofill
    -> );
  • 插入数据,代码如下:
    mysql> insert into zerofill_test values(1,2);
    Query OK, 1 row affected (0.01 sec)
    mysql> insert into zerofill_test values(325, 510);
    Query OK, 1 row affected (0.01 sec)
  • 查表:
    mysql> select * from zerofill_test;
    ±-----±-----------+
    | a | b |
    ±-----±-----------+
    | 325 | 0000000510 |
    | 1 | 0000000002 |
    ±-----±-----------+
    2 rows in set (0.00 sec)
  • 其实int默认是 10 10 10 位也是有原因的,因为它的最大值就是二十一亿多( 10 10 10 位数字),unsigned也就是四十二亿多( 10 10 10 位数字)。

5. PRIMARY KEY

??5.1 关键词解释??



  • primary key用来 唯一的 束缚该字段内里的数据,不能重复,不能为空

    • 主键要求表中每一行记载的值都是唯一的,也就是说,主键字段的值不能重复。每行数据的主键值都是唯一的,确保数据的唯一性。
    • 主键字段不能为 NULL。也就是说,在定义主键时,MySQL 会自动给该字段添加 NOT NULL 束缚。每一行数据在插入时,主键字段必须提供一个有效的、非空的值。

  • 一张表中最多只能有 一个主键,但可以由一个列或多个列构成(复合主键)。

    • 主键可以由一列或多列字段构成。一个单列主键称为“单列主键”,而由多个列构成的主键称为“复合主键”。

      • 单列主键:表中只有一个字段作为主键。
      • 复合主键多个字段组合成一个主键,保证唯一性。


  • 主键所在的列通常是 整数类型
??5.2 用法示例??

5.2.1 单列主键



  • 可以用以下两种方式定义主键:
    #方法1:
    mysql> create table if not exists primarykey_test(
    -> stu_id int,
    -> name varchar(20),
    -> gender char(2) default ‘男’,
    -> primary key(stu_id)
    -> );
    Query OK, 0 rows affected (0.04 sec)
    方法2:

    mysql> create table if not exists primarykey_test(
    -> stu_id int primary key,
    -> name varchar(20),
    -> gender char(2) default ‘男’,
    -> );
    Query OK, 0 rows affected (0.04 sec)
  • 查看创建信息:

    • 发现自动添加了 NOT NULL 束缚。




  • 插入信息,发现假如有了主键束缚,此列信息不能重复:



  • 可以删除主键,代码如下:
    mysql> alter table primarykey_test drop primary key;
    Query OK, 1 row affected (0.16 sec)
    Records: 1 Duplicates: 0 Warnings: 0
    mysql> desc primarykey_test;
    ±-------±------------±-----±----±--------±------+
    | Field | Type | Null | Key | Default | Extra |
    ±-------±------------±-----±----±--------±------+
    | stu_id | int | NO | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    | gender | char(2) | YES | | 男 | |
    ±-------±------------±-----±----±--------±------+
    3 rows in set (0.00 sec)



  • 删除后可以重新添加,但要 保证添加这一列中没有重复的值!!
    mysql> alter table primarykey_test add primary key(stu_id);
    Query OK, 0 rows affected (0.11 sec)
    Records: 0 Duplicates: 0 Warnings: 0
    mysql> desc primarykey_test;
    ±-------±------------±-----±----±--------±------+
    | Field | Type | Null | Key | Default | Extra |
    ±-------±------------±-----±----±--------±------+
    | stu_id | int | NO | PRI | NULL | |
    | name | varchar(20) | YES | | NULL | |
    | gender | char(2) | YES | | 男 | |
    ±-------±------------±-----±----±--------±------+
    3 rows in set (0.00 sec)


5.2.2 复合主键



  • 定义方法,代码如下:

    • 这个表中定义主键的意思是一个学生可以选择多门课,一门课可以被多名学生选择,但是 不存在一名学生重复选择同样的课的环境
    mysql> create table if not exists primarykey_test2(
    -> stu_id int,
    -> course_id int,
    -> grade int,
    -> primary key(stu_id, course_id)
    );
    Query OK, 0 rows affected (0.04 sec)

  • 查看创建信息和表结构:

主键的特点与束缚:


  • 每个表只能有一个主键,但是主键可以包含多个字段(即复合主键)。
  • 假如表中已经有一个字段被定义为主键,其他字段就不能重复该主键的值。


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表