MySQL-表的约束

文章目录


一、空属性

之前我们将表的机构,使用desc table_name查看表的结构的时候,我们并没有说明Null这一栏代表的什么意思,现在我们就来详细讲解一下。

试想一种场景,我们要统计一个班上的人员信息,我们就需要创建一个表,这个表需要保存学生的姓名,学号,地址等信息。 以实际需求来讲,我们在插入表的时候,这里的姓名和学号是一定不能为空的,所以为了约束程序员在对表插入信息的行为,就可以使用添加是否允许一个字段的数据可以被设置为NULL。

那么怎么才能约束这种空属性的行为呢?

我们只需要在创建表的时候对字段添加上 not null 就可以约束该字段不允许为NULL。

可以看到,对设置的not null的字段强行设置为null时,数据库是会给我们报错的!

所以可以通过设置null空属性来对我们表插入的一种约束!

二、默认值

直接教用法:

然后插入数据

可以看到,我们设置的字段如果带有default默认值,在插入时如果忽略这个字段,会默认根据我们的设置的default默认值来填充这个字段。


三、zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。

mysql> show create table tt3\G

***************** 1. row *****************

Table: tt3

Create Table: CREATE TABLE tt3 (

a int(10) unsigned DEFAULT NULL,

b int(10) unsigned DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=gbk

1 row in set (0.00 sec)



int(N)中的(N)如果没有携带zerofill就没有意义了,那么它的作用是什么呢?

  • 一旦添加了zerofill,该数字类型就会变成unsigned,所以也就不能再设置为负数。
  • 我们使用select查询表中的内容时,可以发现,如果你输入的数字少于N位,输出的时候就会用0来填补位数;如果你输入的位数大于N位,就不会有任何影响。

四、列描述

列描述--comment之前我们就已经接触过了。

comment更像是一种注释的行为,也算是一种约束。

五、主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键。 主键所在的列通常是整数类型。

例如下面我们要创建一个student表,要以学生的学号作为主键。

方法1

方法2

在插入的时候,作为主键的字段不允许插入重复的数据,否则会报错。

删除主键

当创建好了一个表,并且创建表的时候就设置好了主键,如果又想删除这个字段的主键性质,应该怎么办?

追加主键

当有一个表,这个表没有主键,现在想让一个字段追加主键性质,应该怎么办?

复合主键

上面不是说 一张表中最多只能有一个主键吗? 为什么这里有两个主键?

这里的主键其实也只是一个,只不过这个表的主键添加到了两列上。

复合主键所带来的就是 在插入数据的时候,只要被设为主键的字段不同时存在相同的数据,就不会报错。

这里就是只要id和phone_num不同时都重复,插入就不会有问题,只有一个重复是没有关系的。

根据主键快速索引

六、自增长

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

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


我们再调用show create table student \G;

可以看到这里是有一个AUTO_INCREMENT=22来控制这种自增长的。

last_insert_id()

LAST_INSERT_ID() 是 MySQL 中的一个函数,它用于获取最近一次使用 AUTO_INCREMENT 字段的 INSERT 或 UPDATE 语句生成的 ID 值。这个函数非常有用,特别是在你插入数据到包含自增主键的表中,并希望立即获取这个新生成的主键值的时候。

七、唯一键

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

那么唯一键跟主键有什么区别呢?

主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。(其实也就是哲学意义不同)

对一个字段设置唯一键属性,可以用unique也可以用unique key。

我们还可以看到,primary key是默认带有not null属性的,unique key是不默认带有not null属性的。

八、外键

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

这里我们举一个例子就是主表为class,它有班级编号和班级名称;从表为student,它有学生的所属班级和学生的个人信息。 这里我们就可以让student表的所属班级与class表的班级编号相关联。

class表(主表)


student表(从表)


当从表student在向class_id插入1,2,3时都是非常顺利地插入进去的,但是当插入4的时候就报错了,这是因为我们的主表class只有1,2,3三个class_id,没有4这个班级编号,所以当从表student在插入4时才会报错,这就说明了这两个表已经建立了约束关系。

那如果我的主表想删除一行怎么办?

可以看到,如果我们想要删除主表中class_id=1的一行数据,数据库是不让我删的,这是因为我们的从表student也已经有对应的外键class_id=1,如果想要主表删除class_id=1这一数据行,首先就要删除所有从表外键class_id=1的数据行。

这也说明 主表和从表因为外键是互相约束的。


相关推荐
倔强的石头_7 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
阿巴斯甜12 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker13 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952714 小时前
Andorid Google 登录接入文档
android
黄林晴15 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android