MySQL表的约束

文章目录

  • 概念
  • 空属性
  • 默认值
  • 列描述
  • zerofill
  • 主键
    • 复合主键
  • 唯一键
  • 外键
    • 主表的删除
  • 自增长

概念

表中一定要有各种约束,通过约束让未来插入数据库表中的数据是符合预期的

约束的本质是通过技术手段,倒逼用户插入正确的数据站在数据库的视角凡是插入进来的数据都是符合数据约束的

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

所以为了更好的对数据进行约束,就需要更多的约束条件

空属性

null:允许为空

not null:不允许为空

在建表的时候就可以对表的字段进行设置,如果不指明则默认为空,指明为not null则表示该字段不能为空

create table if not exists class( 
class_name varchar(20) not null, 
class_num int not null
);

MySQL表的约束_第1张图片

MySQL表的约束_第2张图片

默认值

default指定默认值

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

如果某字段用default设置了之后,在插入时如果不指明该字段的值则使用默认设置的值

create table if not exists people( 
name varchar(20) not null,
age int unsigned default 20, 
gender char(1) default '男' 
);

MySQL表的约束_第3张图片

MySQL表的约束_第4张图片

MySQL表的约束_第5张图片

如果某个字段有设置了 not null同时也设置了default值,那么该字段如果不指明插入数据,则默认使用default值不会报错。

也就是说default和not null是互相补充的,并不冲突

如果在建表时没有设置default值,并且也没有设置not null。那么mysql会默认给字段加上NULL的默认值

列描述

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

create table if not exists test(
name varchar(20) not null comment '这是名字',
age int unsigned default 20 comment '这是年龄', 
gender char(1) default '男' comment '这是性别'
);

需要注意,comment的信息使用desc是看不到的,需要使用

show create table XXX\G

MySQL表的约束_第6张图片

zerofill

先对比一下不加zerofill和加上的效果

create table if not exists test1(
a int(10),
b int(5)
);

create table if not exists test2(
a int(10) zerofill,
b int(5) zerofill
);

MySQL表的约束_第7张图片

同样是插入1和2为什么显示的效果不一样呢

这就是zerofill的作用了,如果插入数据的宽度小于设定的宽度(这里设置的是a是10,b是5),自动填充0

但是需要注意这只是最后显示的结果,在MySQL中实际存储的还是1

如果b插入的是111111,六个1那就只会显示出6个1

主键

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

例如个人信息的表,每个人都有且只有一个唯一的身份证号,那么个人信息表中就可以设定身份证号为主键,也就是不能出现相同的身份证号

create table people(
id int unsigned primary key,
name varchar(20) not null
);

MySQL表的约束_第8张图片

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

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

也可以删除主键

alter table 表名 drop primary key;

复合主键

主键并不是只能由一个字段组成,可以由多个字段一起组成。

假设现在由id和name字段组成主键,则就代表着如果出现了id重复但name并不重复的数据是可以插入的,同理id不重复name重复的数据也是可以插入的,只有id和name都重复的数据才不可以插入

create table people(
id varchar(20) not null,
name varchar(20) not null,
gender char(1) not null,
primary key(id, name)
);

MySQL表的约束_第9张图片

唯一键

一张表中只能有一个主键,但是在现实业务逻辑中并不是只有一个字段需要唯一性。因此唯一键的作用是保证数据的唯一性,但是和主键的区别在于唯一键可以为空,主键不可以为空

create table people(
id varchar(20) not null primary key,
name varchar(20) not null unique,
gender char(1) not null
);

MySQL表的约束_第10张图片

外键

外键用于表和表之间的约束,也就是有主表和从表的关系。而外键的主要定义是在从表上

就好比现在有一个表记录着目前所有的班级信息,另一张表记录着学生的信息(其中包括所在班级信息)。那么如果要插入一个学生的信息,首先要一定保证的就是这个学生信息中的班级一定要存在,不存在的话就是一个无效数据。而班级存不存在就可以从第一张表中找到,因为第一张表记录的就是所有已存在的班级信息。

这个例子就代表着班级信息的表是主表,学生信息的表是从表,如果从表要插入数据,那么该数据中对应班级的字段就一定要在主表中找到对应的数据才可以插入

根据代表来验证一下

create table class(
id char(2) not null primary key,
name varchar(20) not null unique
);

create table stu(
id varchar(20) not null primary key,
name varchar(20) not null,
class_id char(2) not null,
foreign key(class_id) references class(id)
);

创建从表的class_id和主表的id外键约束关联

首先主表插入数据

MySQL表的约束_第11张图片

接下来看从表插入数据

MySQL表的约束_第12张图片

从图中就可以看出外键的作用

主表的删除

现在从表的数据中已经有跟主表关联了,那么想删除掉主表中的某一行数据,直接删除可以吗?

delete from class where id=2;

image-20230816014755554

很明显这是不可以的,为什么呢

因为在从表中已经有数据和主表中的这一行数据关联了,如果这行数据被删除了那么从表中的对应数据就是无效数据来着,很明显就不正确。所以想要删除掉主表中的某一行数据,就要先把从表中和这一行有关联的数据先删除掉

MySQL表的约束_第13张图片

自增长

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

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只能有一个自增长
create table class(
id int unsigned primary key auto_increment,
name varchar(20) not null unique
);

MySQL表的约束_第14张图片

注意是在插入后获取上次插入的 AUTO_INCREMENT 的值,并不是固定的从1 2 3这样依次。上一次如果是1000那这一次就是1001

你可能感兴趣的:(MySQL,mysql,数据库)