当前位置: 首页 > news >正文

MySQL 中表的约束 -- 空属性,默认值,主键,自增长,唯一键,外键

目录

1. 空属性

2. 默认值

3. 列描述

4. zerofill

5. 主键

6. 自增长

7. 唯一键

8. 外键


        真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束来更好的保证数据的合法性,业务角度上看用于保证数据的正确性。约束本质是通过技术手段保证用户插入正确的数据。

1. 空属性

        两个值:null(默认的)和 not null(不为空)。

        数据库默认字段基本都是字段为空,但是在实际开发中,尽可能保证字段不为空,因为数据为空没有办法参加运算

        下列属性中的 Null 为 NO 表示插入时该字段不能为空,Null 为 YES 时,表示插入时该字段可以为为空。 

        当插入时,不对 class_room 字进行插入,就会插入默认值,这里报错是说没有默认值,所以插入失败。

        这里对 class_room 插入 null,会报错说 class_room 不能为 null。 这就叫做非空约束

2. 默认值

        default:某一字段会经常性的出现某个具体的值,可以在一开始就指定好该字段的默认值,在需要真实数据的时候,用户可以选择性的使用默认值。

         使用 show create table 表名 查出来的 name 字段是没有默认值的,而 desc 表名 查出来的是 name 字段默认值为 null。这里就有冲突,这时候以 show create table 表名 查出来的为准

        在创建的时候设置 default 值,在查看表属性的时候 default 就是用户指定的值。

        插入时,当用户没有对有默认值的字段进行插入,则就会使用默认值进行填充。 

        如下图所示,name 字段没有默认值,所以在插入的时候没有明确指定 name 字段,插入失败。

知识点1:
       如果某一字段没有设置 default 值,那么在插入的时候必须明确指定该列的列名称进行插入,否则插入失败。如果某一字段设置 default 值,那么在插入的时候可以不用指定该列的列名称进行插入,默认有 default 值进行填充。换句话说,default 属性没有在插入时必须指定列名。
 

3. 列描述

        comment:没有实际含义,专门用来描述字段,会根据表创建语句保存,用于用户来进行了解。

        注:通过 desc 表名 是查看不到注释信息的,必须通过 show create table 表名 查看。 

4. zerofill

        zerofill 是一种显示上的约束,zerofill 的作用就是,如果数值类型宽度小于设定的宽度(数据类型后面的数字,比如:int(10)),自动填充 0。但是在数据库中存储的值没有改变,只是显示进行了格式化显示。添加 zerofill 约束之后,数值类型会变为 unsigned 类型

5. 主键

        主键:primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表最多只能有一个主键(不意味着主键只能添加给一列,一个主键可以被添加到一列或者多列);主键所在的列通常是整数类型。

        如上图所示,在进行表的创建时,指定了 id 添加主键,则会自动将其设为非空且 key 属性设为 PRI。

        如上图所示,当表中有了主键为 1 的数据时,再插入 主键为 1 的数据就会插入失败,所以主键可以用于表示表中一条数据的唯一性。 

        当表创建好但是没有主键的时候,可以添加主键

alter table 表名 add primary key(字段列表);

        注:如果添加主键的那一列有重复的值,则添加主键会失败。 

        删除主键

alter table 表名 drop primary key;

        复合主键

        这里表示 id 和 course_id 合起来为一个主键,如果其中只有一个字段重复,是可以进行插入的。

        上述表表示,同一名学生不能同时选两门相同的课,不同的学生可以选相同的课,同一名学生可以选多门不同的课。 

        复合主键在创建表的时候或者添加时就必须一次指定好哪几列为主键,不能给一列添加主键之后再给另外一列添加主键。

        如上图所示,这时候 id 和 course_id 已经是主键了,将 score 添加主键就会失败。 

6. 自增长

        自增长(auto_increment):当对应字段不给值会自动的被系统触发,系统会从当前字段中已经有的最大值进行 +1 操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

        任何一个字段要做自增长,前提是本身是一个索引(key 一栏有值),并且自增长字段必须是整数且一张表最多只能有一个自增长。

        如下图,当进行插入的时候不指定 id,则默认会j将表中已有的最大值 +1 作为新数据该字段的值。 

        如下图所示,表的属性信息中有一个 auto_increment 属性,表示下次再插入数据时,自增长的值为多少。 这个值也可以进行手动的设置。

7. 唯一键

        一张表中往往有很多字段需要唯一性,但是一张表中只能有一个主键,唯一键可以解决表中有多个字段需要唯一性约束的问题

        唯一键的本质和主键差不多,唯一键允许为空(可以通过对空属性进行设置,使其不允许为空),而且可以允许多条数据为空,空字段不做唯一性比较。

    0 0   上述的 unique 也可以写成 unique key。 

        唯一键和主键的区别:
                主键更多的是标识这一条数据的唯一性。而唯一键更多的是标识某一字段的唯一性。就比如身份证号和邮箱号,一个人的身份证号用于标识这个人的唯一性,而邮箱号表示这个人的邮箱,可以没有,也不能对这个人进行唯一性标识,但是邮箱号是不可以重复的。上述中的身份证号和邮箱号的区别就可以对应看成主键和唯一键的区别。

8. 外键

        外键用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须有主键约束或唯一键约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为 null。

foreign key (字段名) references 主表(列)

        如上图所示,主表为 class,从表为 student。从表中的 class_id 字段受到外键约束。当对 student 表中插入一个 class_id 不属于 主表 class 中 id 列中的数据,则会插入失败。 

        如下图,当前 class 表中有 id 为 1 和 2 的班级,当向 student 中插入数据时,class_id 字段没有在 class 表的 id 中存在,则会插入失败。如下图中插入赵六的数据。

        当 student 表中还存在 班级为 1 的学生时,删除 class 表中 id = 1 这一行数据也是不行的。 

 

相关文章:

  • 湖北理元理律师事务所债务优化方案解析:如何科学规划还款保障生活质量
  • 虚幻基础:AI
  • PDF 转 JPG 图片小工具:CodeBuddy 助力解决转换痛点
  • 算法备案审核周期
  • 【PostgreSQL】数据探查工具1.0研发可行性方案
  • 板凳-------Mysql cookbook学习 (六)
  • esp32 lvgl9.2版本,透明底色图片的,透明部分被渲染成黑色,不随背景颜色变化解决办法
  • Python实例题:人机对战初体验Python基于Pygame实现四子棋游戏
  • 量子计算:开启未来计算新纪元的革命性技术
  • 如何对两段轨迹进行拟合过渡
  • 语音搜索崛起:专业优化指南助您引领潮流
  • Leaflet根据坐标画圆形区域
  • RK3588 DRM 介绍及调试记录
  • 力扣刷题Day 53:和为 K 的子数组(560)
  • 消息队列在异步推理任务中的作用
  • 86. Java 数字和字符串 - 数字
  • java刷题(6)
  • 部署n8n
  • 树莓派开箱上手教程(无需显示器版)
  • 战略-2.1 -战略分析(PEST/五力模型/成功关键因素)
  • 西安seo网站关键词优化/整合营销传播的六种方法
  • 建设电商网站/如何在百度发广告推广
  • 网站建设学生选课课程设计报告/直播回放老卡怎么回事
  • 数字展厅网站建设/沈阳seo排名优化推广
  • 网站移动转换/seo技术教程
  • 广东深圳疫情最新/seo按照搜索引擎的什么对网站