mysql主键约束怎么写(mysql中主键约束)

mysql主键约束怎么写(mysql中主键约束)插入到 mysql 表中的数据一定要有约束 通过 约束 让将来插入到 mysql 的所有数据都应该是符合预期的 所以 实际上约束的本质就是 通过技术手段 倒逼程序员插入正确的数据 所以反过来 我们就可以认为 站在 mysql 的视角看到的所有数据都是符合预期的数据 约束的最终目标 保证数据的完整性和可预期性 原生的数据的约束是 数据类型



插入到mysql表中的数据一定要有约束,通过约束,让将来插入到mysql的所有数据都应该是符合预期的。

所以,实际上约束的本质就是通过技术手段,倒逼程序员插入正确的数据,所以反过来,我们就可以认为站在mysql的视角看到的所有数据都是符合预期的数据

约束的最终目标:保证数据的完整性和可预期性

原生的数据的约束是数据类型,但是显然只靠数据类型来进行约束是不可能达到最终目标的,所以需要在此基础上对每个字段增加约束,所以这里介绍部分mysql中的约束

在mysql中,默认每个字段的值都是空,但是实际上并不推荐允许为空,因为null不参与运算

image-20241025165130687

为了让字段内都有值,就可以为字段增加非空约束

案例:创建一个班级表,包括班级名和教室名

站在业务的逻辑下,任何一个班级都必须要有班级名和教室名,不能为空,所以数据库表的设计者在设计表的时候就应该设置对应字段不能为空,所以可以设置表为:

 
 

image-20241025170749588

在实际生产环境中,有些字段并没有填入值,但是从业务角度,这个不能为空,比如遇到上述的没有默认值的情况,或者是经常性的出现某些值,可以在一开始就指定好,在需要真实数据的时候,可以选择性的使用默认值。

 

image-20241025173337803

注意:只有设置了default的列,才可以在插入值的时候,对列进行省略

问题:实际测试时发现,只要某个字段没有设置非空约束,插入时对该列进行省略,也是可以插入成功的,这是什么原因?

image-20241025173857980

这是因为在创建表时,mysql会给我们写的sql进行优化,使用

image-20241025174132068

列描述:,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解

 

image-20241026164917385

image-20241026164951311

在之前数据类型的讲解中,我们知道了和类型,在使用的时候后面的括号表示最大字符个数,但是如果细心一点就会发现,后面也有括号,之后有内容,这是为什么呢?int在mysql中只有4个字节呀?

image-20241026165814383

其实这个跟表的约束有关,如果该字段没有约束,这里其实是无效的

 

再查看的数据会发现

image-20241026171250088

注意:虽然显示的内容是带有0的,但是在mysql中实际存储的还是不带0的值,可以用hex查看

image-20241026171809623

主键:用来唯一的约束该字段里面的数据,不能重复,不能为空一张表中最多只能有一个主键;

主键所在的列通常是整数类型

案例:创建表的时候直接在字段上指定主键

 

image-20241026173208946

  • 主键标识的字段内容不能重复,一旦重复,则插入失败

image-20241026173422243

  • 删除主键
 

image-20241026173802224

  • 当表创建好以后但是没有主键的时候,可以再次追加主键
 

image-20241026173934574

在实际的业务中,有可能任何一列都有可能重复,所以不作为主键,但是多个字段在一起是不重复的,这个时候就可以让多个字段的内容在一起作为该表的主键,成为复合主键

案例:

 

image-20241026174650212

image-20241026181542177

image-20241026181606202

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

自增长的特点:

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

image-20241026182305135

image-20241026182413371

可以看到id是自动增加的

mysql如何知道下一个要插入的id值是多少呢?

image-20241026182543187

可以通过获取到上一次插入的自增值

image-20241026182658616

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键;

唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

关于唯一键和主键的区别:我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复

乍一听好像没啥区别,我们举一个例子:

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助理解) 比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一 个是员工工号,我们可以选择身份号码作为主键。而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键。
一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。

 

image-20241028145728990

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

 

举个例子,帮助理解外键的概念:

假设在学校,需要一个学生管理系统,每个学生都会属于一个班级,也就是,班级也需要被管理起来,也就是说需要一个班级表,那么学生表和班级表在逻辑上就会有关联,但是在实际上没有约束力,比如:

  1. 错误插入一个不存在的班级的学生
  2. 可以删除一个还存在学生的班级

对于上述情况,就需要使用外键,为两个表之间增加一个强迫的“约束”

那么给谁添加约束?从表!!!

主表从表是什么?

在上述的场景中,我们可以发现,是某一个表的数据依赖于另一个表,那么这个被依赖的表就被称为主表,依赖其他表的被称为从表,所以上述场景中,学生表的内容依赖于班级表,所以学生表是从表,班级表是主表。因此是在学生表中添加外键。

 

image-20241028163242267

 

image-20241028164416860


本节完……

编程小号
上一篇 2025-02-21 19:57
下一篇 2025-03-27 08:51

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/48403.html