【MySQL 05】表的约束

目录

1.约束的概念

 2 空属性约束

 3.默认值约束

4. 列描述(comment)

 5.补零(zerofill)

6.主键约束 (primary key)

基本案例

主键的删除与添加

复合主键

复合主键的删除与添加

7. 自增长约束(auto_increment)

基本案例

建表时设置起始值

last_insert_id()

8.唯一键 (unique)

 9.外键约束


1.约束的概念

        MySQL表中的约束(Constraints)是强加于表上的规则,用于限制存储在表中的数据类型,并确保数据的准确性和可靠性。这些约束有助于维护数据的完整性,防止无效数据的插入或更新。

        比如有的数据是必填项,就像身份认证的时候,或者填注册信息的时候,手机号身份证这种就不能空着,所以就有了非空约束;又有的数据比如用户的唯一id,不能跟其他人的一样,所以就需要使用唯一约束等等。

 2 空属性约束

  • 两个值:null(默认的)和not null(不为空)
  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算

案例:

        创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:

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

        所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。

两个字段都不能为空,否则插入失败

 3.默认值约束

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

案例

        我们创建了t8表,其中age和name都给了默认值,我们进行填充具体的数据就是填充的数据,不填充就给默认的值。

同时给not null和 default

        这样会不会冲突呢,not null 表示不为空,如果设置了default该字段本就不为空了,但该字段不能手动给NULL的数据,如果只有default那么该字段是允许给NULL的。

4. 列描述(comment)

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

案例

        当创建表,不知道对应字段的含义时,就可以查看建表命令,查看对应comment对字段的表述信息。

 5.补零(zerofill)

  1. 显示宽度:当你指定 ZEROFILL 时,通常需要同时指定列的显示宽度(例如 INT(5) ZEROFILL)。但是,需要注意的是,这个显示宽度并不限制值的范围,它只影响值的显示方式。

  2. 自动填充零:如果列的值在转换为字符串以进行显示时长度小于指定的显示宽度,MySQL 会在其前面填充零直到达到指定的宽度,超过宽度就不会补0.

  3. 正数和负数:对于负数,ZEROFILL 不会自动填充零。因为负号(-)会占用一个字符位置,所以实际的数字部分会相应地向右移动,且不会进行零填充。

  4. 默认值:如果列有默认值且未指定 ZEROFILL,则在添加 ZEROFILL 后,可能需要重新考虑默认值的设置,以确保它符合预期的显示格式。

  5. 字符类型不适用ZEROFILL 仅适用于数字类型(INTBIGINTDECIMALNUMERIC),不适用于字符类型(如 VARCHARCHAR)。

假设我们有一个表 employees,其中有一个列 id 被定义为 INT(5) ZEROFILL

如果我们向表中插入一些值:

id 被相应地用零填充以达到指定的宽度。

6.主键约束 (primary key)

        主键是表中的一列或多列的组合,用于唯一标识表中的每一行。换句话说,主键列的值必须是唯一的,不能重复,并且表中的每一行都必须有一个主键值(尽管这个值可以是NULL,但在实际使用中,通常不会将主键设置为允许NULL,因为这样会失去主键的唯一性意义)。

        

主键约束是作用于主键列或列组合上的一种约束,它自动地实施了两个关键的规则:

  1. 唯一性(Unique):确保表中所有行的主键值都是唯一的。不允许有两行具有相同的主键值。
  2. 非空(Not NULL):主键列不允许包含NULL值。这是因为如果主键可以包含NULL,那么它就可能无法唯一地标识表中的每一行。

基本案例

主键不可重复

我们还可以根据主键去对数据进行增删查改

主键的删除与添加

        删除一张表的主键,因为主键唯一,指的时删除主键约束(而不是删除列本身)

        添加主键,本质就是重新加上主键约束,但要保证主键列不可以有重复的数据且数据不为空,否则不能添加成主键

复合主键

        一张表中只有一个主键,但主键是可以给多列的——复合主键。

        复合主键是数据库表设计中的一个重要概念,它指的是由两个或多个字段(列)共同组成的主键,用于唯一标识数据库表中的每一条记录。

基本案例

        我们将学生的id和课程代码为复合主键,这有什么效果呢?

         学号为1的同学可以选择E1课程,当然也可以选择E2课程,但是1号同学选了E1课程,就不能再次选择了。也就是说复合主键,只要其中一个列和历史数据不一样的话,都是可以的,但不能两个都和历史数据相同。

复合主键的删除与添加

        直接删除主键约束即可

        添加主键约束,确保所有主键列每行不能同时出现重复数据且保证数据不为空即可

7. 自增长约束(auto_increment)

        自增长(Auto-Increment)约束是一个特性,用于在插入新记录时自动生成唯一的数字,这个数字通常是递增的。它主要用于主键列,以确保每条记录都有一个唯一的标识符。当表中添加新记录而该记录的自增长列未明确指定值时,MySQL会自动为该列赋予一个比当前最大值大1的值(如果该表为空,则通常从1开始)。

        在创建表时,可以通过在列定义后添加AUTO_INCREMENT属性来添加自增长约束。这个属性通常与PRIMARY KEY约束一起使用,因为主键列的值必须是唯一的。

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

基本案例

        与主键搭配使用

        只插入name列,id列自增

        你也可以对id进行手动插入,只不过,之后如果插入会从此刻id后自增长,要保证不能插入重复的id

建表时设置起始值

        起始如果不设置起始值,auto_increment默认等于1,如果在中间手动插入id,其实就是将auto_increment的值进行了修改。

last_insert_id()

  last_insert_id() 是一个在多种数据库系统中都存在的函数或方法,但特别在 MySQL 和一些兼容的数据库(如 MariaDB)中广泛使用。这个函数的主要作用是返回最近一次使用 AUTO_INCREMENT 属性插入到表中的行的 ID 值

8.唯一键 (unique)

        一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

        唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

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

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,
一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。

而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。

具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,
那么就可以将员工工号设计成为唯一键。

一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,
我们可以尽量不会对主键做过大的调整。

        也就是说,一个人身上有多个属性,很多属性也都是具有唯一性的,需要做唯一键的约束,而主键,就是从众多的唯一性中选出来作为主键的,主键和唯一键不冲突,而是互为补充的。

基本案例

        我们将id设置为主键,学号为唯一键

        由于02学号已被占用,学号被设置唯一键,不可以存在重复的值,因此再次插入02失败。

        被设置唯一键的字段是允许为空的,且设置为空字段不做唯一性比较

 9.外键约束

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

语法:

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

        学生表依附于班级表,所以我们将学生表称之为从表,班级表我们称之为主表。class_id这一列是用于与另一个表产生关联关系的,所以我们称class_id为外键

案例

        创建一个学生表(从表),class_id字段已被设置成外键

        创建一个班级表

        给class表插入数据

        给student插入数据,我们选择课程id为1,2的时候,是可以插入成功的,插入其它id号,就会发生外键约束,MySQL拦截此操作

        对class表中id为1进行删除,此时是不能删除的,因为从表中外键还存在此id

        如果我们把从表中外键为1的行删除,再做上面操作,就是被允许的

外键:1.是从表和主表的关联关系 2. 产生外键约束

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值