【MySQL】MySQL中的四大约束(非空约束、唯一性约束、主键约束、外键约束)详解【附源码】

MySQL约束(constraint)

在创建表的时候,我们需要对表中的某些字段加上约束(constraint),来保证这个表中数据的完整性、有效性。
常见的约束条件:非空约束、唯一性约束、主键约束、外键约束、检查约束(mysql不支持,oracle支持)。
约束条件一般在创建表的时候声明,约束条件可以同时作用在一个字段上,也可以多个字段使用相同的约束。

1.非空约束(not null)

not null 约束的字段不允许为null,必须有值;只有列级约束,若设置多行非空,必须每行都添加非空约束条件。
语法格式:create table 表名(字段名1 字段类型,字段名2 字段类型 not null);
例:创建t_vip表,并插入数据

create table t_vip (id int,name varchar(25) not null);

在这里插入图片描述
向表中插入数据:

insert into t_vip(id,name) values (1,"风清扬");
insert into t_vip(id,name) values (2,"令狐冲");
insert into t_vip(name) values ("任盈盈");
insert into t_vip(id) values (4);

在这里插入图片描述
此时,name为空时数据并未插入表中。
在这里插入图片描述

2.唯一性约束(unique)

unique约束的字段不允许重复,但是可以为null;
unique放在一个列上,是列级约束;unique放在多个列上,是表级约束。
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型 unique...);
例:创建t_vip表,并插入数据

create table t_vip (id int,name varchar(25) unique, age int);

在这里插入图片描述
向t_vip中插入数据:

insert into t_vip(id,name,age) values (1,"张无忌",20);
insert into t_vip(id,name,age) values (2,"赵敏",19);
insert into t_vip(id) values (3);
insert into t_vip(id,name,age) values (4,"张无忌",19);

在这里插入图片描述
最后一条插入失败,因为name与表中已有的数据相同。
在这里插入图片描述

(1)两个字段联合唯一约束

语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型,...unique(字段名2,,字段名3));

 create table t_vip(id int,name varchar(25),phone varchar(20), unique(name,phone));

在这里插入图片描述

(2)not null与unique联合

在mysql中,若一个字段同时被not null和unqiue约束,则该字段默认称为主键(Oracle中不适用)。此时的该字段不能为空,也不允许重复。
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型 not null unique,...);

create table t_vip (id int not null unique,name varchar(25));

在这里插入图片描述

3.主键约束(primary key)

主键约束术语:
主键约束:就是一种约束;
主键字段:该字段上添加了主键约束,这样的字段叫做主键字段;
主键值:主键字段中的每一个值都叫做主键值;
主键的特征:not null + unique(非空且不重复)
主键是每一行的唯一标识,没有主键的表是无效表,因为可能会有一行多多行数据完全相同

关于主键的说明
① 主键约束可以是列级约束,也可以是表级约束;
② 使用表级约束可以设置复合主键primary key(字段名1,字段名2…)
③ 一张表只能设置一个主键约束,但是可以多列联合起来设置为复合主键;
④ 主键数据类型:int、bigint、char等类型,一般设置为数字且是定长的。

(1)单一主键

定义:只对某一列添加主键约束
语法格式:
create table 表名(字段名1 类型 primary key,字段名2 类型...);(列级约束)
create table 表名(字段名1 类型,字段名2 类型...,primary key(字段名));(表级约束)
例:创建t_vip表,并插入数据

create table t_vip (id int primary key,name varchar(25), age int);

在这里插入图片描述
向表t_vip中插入数据:

create table t_vip (id int primary key,name varchar(25), age int);
insert into t_vip(id,name,age) values (1,"张无忌",20);
insert into t_vip(id,name,age) values (2,"赵敏",19);
insert into t_vip(id) values (3);
insert into t_vip(id,name,age) values (2,"周芷若",18);

在这里插入图片描述
倒数第二条插入失败,因为主键id为空,最后一条插入失败,与因为主键id与表中已有的数据id相同。
在这里插入图片描述

(2)复合主键

定义:使用表级约束对多个列设置主键约束(只有表级约束)
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型...,primary key(字段名1,,字段名2));
例:创建sc表,并向表中插入数据

create table sc(
sno bigint not null, 
cno int not null,
grade  int,
primary key(sno,cno));

在这里插入图片描述
向sc表中插入数据:

insert into sc(sno,cno,grade) values(201215121,1,92);
insert into sc(sno,cno,grade) values(201215121,2,85);
insert into sc(sno,cno,grade) values(201215121,1,88);
insert into sc(sno,cno,grade) values(201215122,2,90);
insert into sc(sno,cno,grade) values(201215122,3,80); 

在这里插入图片描述
第三条数据插入失败,因为复合主键(sno,cno)重复。
在这里插入图片描述

(3)自然主键

自然主键:主键值是一个自然数,和业务没关系。
语法格式:create table 表名(字段名1 类型 primary key auto_increment,字段名2 类型...));
例:创建t_vip表,并插入数据

create table t_vip(id int primary key auto_increment,name varchar(20));

在这里插入图片描述
向t_vip中插入数据(主键设置为自然主键,可以自增,从1开始,每次自增1)

insert into t_vip(name) values("张无忌");
insert into t_vip(name) values("周芷若");
insert into t_vip(name) values("张翠山");
insert into t_vip(name) values("殷素素");
insert into t_vip(name) values("张真人");

在这里插入图片描述
虽然没有输入主键,但是可以实现自增。
在这里插入图片描述

(4)业务主键

业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
(业务主键实际用的少,不利于表的维护,和单一主键使用方法相同)

4.外键约束(foreign key)

MySQL的外键约束用来在至少两张表之间建立链接,其中一张表的一个字段被另一张表中对应的字段约束。也就是说,设置外键约束至少要有两张表。被约束的表叫做子表,对子表进行约束的表叫做父表,子表中被约束字段中的数据的取值只能来自父表中对应的该字段数据的值,属于主从关系。
其中主表中的关联字段叫做主键,外表中的关联字段叫做外键
外键约束作用:让表之间建立关联,减少数据冗余,使数据更加完整,关联性更强。
语法格式create table 表名(字段名1 类型 primary key auto_increment,字段名2 类型(25),字段名3 类型...,foreign key(字段名1) references 另一张表(字段名));
注意外键字段可以为null,外键不一定是主键,但是要被unique约束

外键约束涉及到的相关术语:
外键约束:一种约束( foreign key)
外键字段:该字段上添加了外键约束
外键值:外键字段当中的每一个值-

:创建t_class表(班级表),并插入数据

create table t_class(no int primary key,name varchar(20));

在这里插入图片描述
向t_class表中插入数据

insert into t_class(no,name) values(1801,"软件工程1801班");
insert into t_class(no,name) values(1802,"软件工程1802班");

在这里插入图片描述
:创建t_students表(学生表),并向表中插入数据

create table t_students(
id int primary key auto_increment,
name varchar(25),
classno int,
foreign key(classno) references t_class(no));

向表t_students中插入数据:

insert into t_students(id,name,classno) values (1001,"楚留香",1801);
insert into t_students(name,classno) values ("步惊云",1802);
insert into t_students(name,classno) values ("风清扬",1801);
insert into t_students(name,classno) values ("令狐冲",1802);
insert into t_students(name,classno) values ("小龙女",1801);
insert into t_students(name,classno) values ("张无忌",1802);
insert into t_students(name,classno) values ("楚留香",1803);

在这里插入图片描述
最后一行插入时,子表t_students中的classno取值不是父表t_class中的数据,插入失败。
在这里插入图片描述
外键在使用时可以为null,如向t_students表中插入数据。

insert into t_students(name) values ("楚留香");

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智商三岁半i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值