MySQL之约束

请添加图片描述

约束

1.什么是约束

在创建表时,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性。

2.约束的作用

约束的作用:保证表中数据有效。

3.有哪些约束

约束名称约束条件
非空约束not null
唯一性约束unique
主键约束primary key (PK)
外键约束foreign key (FK)
检查约束check

其中检查约束,MySQL不支持,但是Oracle支持
!!!!!!!主键约束特别重要!!!!!!

4.列级约束和表级约束

这时候有人疑问了,约束应该什么时候用,怎么用。
首先,约束是在建表的时候使用的
其次,约束根据用的位置不同,分成了列级约束表级约束
列级约束: 使用在字段后面的约束,负责约束这一个字段。
表级约束: 使用在建表最后的约束,负责联合约束多个字段(注意理解联合的意义)

drop table if exists t_vip;
create table t_vip(
	id int not null,
	name varchar(23),
	email varchar(255),
	unique(id,name)
);

上面代码中:not null属于列级约束,负责约束id字段 ;unique(id,name)属于表级约束,负责联合约束id字段和name字段
在这里插入图片描述

一,非空约束(not null)

ont null 只能列级约束,不能够表级约束
作用:约束的字段不能为空

drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(23) not null,//列级约束,表示name字段不为空
	email varchar(255)
);
desc t_vip; //查看表结构
insert into t_vip(id) values(1234);

在这里插入图片描述

二,唯一性约束(unique)

unique 可以列级约束,也可以表级约束
作用:约束的字段不能重复,但可为NULL(多个NULL不算重复)

1.unique列级约束

写法1:

drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(23) unique,//列级约束,表示name字段中的值不能够重复
	email varchar(255)
);

写法2:

drop table if exists t_vip;
craete table t_vip(
	id int,
	name varchar(23),
	email varchar(255),
	unique(name)//联合约束,但只有一个字段,相当于列级约束,表示name字段中的值不能够重复
);

2.unique表级约束

drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(23),
	email varchar(255),
	unique(id,name)//表级约束,表示id和name两字段联合起来,不能出现重复。
);

为了进一步理解联合约束的意思,执行以下代码,观察执行后表的结果。

insert into t_vip(id,name) values(1,'Wang');
insert into t_vip(id,name) values(2,'Wang');
insert into t_vip(id,name) values(1,'Li');
insert into t_vip(id,name) values(2,'Wang');

在这里插入图片描述

三,主键约束(primary key)

uniquenot null可以对某一字段联合使用,使用后该字段默认当作primary key(!!!MySQL中是这样的,Oracle不是这样)
such:

drop table if exists t_vip;
create table t_vip(
	id int not null unique,
	name varchar(23),
	email varchar(255)
);

在这里插入图片描述

1.相关术语

主键约束: 一种约束
主键字段: 该字段添加了主键约束,则该字段为主键字段
主键值: 主键字段中的每一个值都叫主键值

2.什么是主键,有什么作用

主键值是每一行记录的唯一标识,用来区分除主键字段外相同的记录
假设表中有以下数据,该如何区分。

namesex
Wang
Wang

给表中加个主键字段就行,如下表

idnamesex
1Wang
2Wang

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!任何一张表都应该有主键,没有主键的表无效!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

3.主键的特征

主键值不能为空不能重复

4.如何添加主键

方法1:

drop table if exists t_vip;
create table t_vip(
	id int primary key,
	name varchar(23),
	email varchar(255)
);

方法2:

drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(23),
	email varchar(255),
	primary key(id)
);

5.主键数量

一张表章,主键约束只能有一个(不是主键字段只能有一个)

6.主键值建议使用的数据类型

建议使用:int,bigint,char…等数据类型,不建议使用varchar。因为主键一般是定长的

7.主键分类

7.1单一主键和复合主键

单一主键:primary key(id) 只有一个主键字段

drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(23),
	email varchar(255),
	primary key(id)
);

复合主键:primary key(id,name) 有不止一个主键字段

drop table if exists t_vip;
create table t_vip(
	id int,
	name varchar(23).
	email varchar(255),
	primary key(id,name)
);

7.2自然主键和业务主键

自然键值:主键值是一个自然数,和业务没有关系。
业务主键:主键值和业务紧密相关,such:银行卡号为主键

选择自然主键还是业务主键

尽量选择自然主键,因为主键只需不重复就行,不需要有意义。
不选择业务主键的原因是:主键一旦和业务拉钩,当业务变动的时候,可能会影响主键值,所以业务主键不建议使用。

auto_increment

在MySQL中,有一种机制,可以自动帮我们维护一个主键值:

drop table if exists t_vip;
create table t_vip(
	id int primary key auto_increment,
	name varchar(23)
);
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');
insert into t_vip(name) values('Wang');

在这里插入图片描述

四,外键约束(foreign key)

1.相关术语

外键约束: 一种约束
外键字段: 该字段添加了外键约束
外键值: 外键字段当中的每一个值

2.什么时候使用外键

假设一个业务背景:要求设计数据库表,来存储“班级”和“学生”的信息
方案一 :将学生和班级存储在一张表中

nonameclassnoclassname
1Wang101FirstSchool
2Li101FirstSchool
3Zhang101FirstSchool
4Xiao102SecondSchool
5Ming102SecondSchool
6Tang102SecondSchool

这种方案可以实现业务要求,但是这种设计方式会导致数据冗余,空间浪费,就像上表中重复出现的FirstSchool和SecondSchool。

方案二:分别设计学生表(t_student)和班级表(t_class)
t_student:

nonamecno
1Wang101
2Li101
3Zhang101
4Xiao102
5Ming102
6Tang102

t_class:

classnoclassname
101FirstSchool
102SecondSchool

t_student中的cno字段没有任何约束时,可能会导致数据无效(表中cno字段可能插入了103等)。
为了保证数据的有效,外键约束就派上了用场,需要给cno字段添加外键约束,那么cno字段就是外键字段,cno中的值就是外键值
那我们赶紧添加外键约束吧,但是先别急,在这之前有另外两个概念要了解…

3.父表和子表

父表(t_class):表示被引用的表。
子表(t_student):表示引用表,该表中含有外键约束。

删表的顺序:先删子表
创表的顺序:先创父表
删数据的顺序:先删子表
插入数据的顺序:先插父表

外键约束的用法:

foreign key(外键字段名) references 父表名(被引用字段名)

根据上面的业务要求,我们来实现一下t_class和t_student

drop table if exists t_student;
drop table if exists t_class;
create table t_class(
	classno int primary key,
	classname varchar(23)
);
create table t_student(
	no int primary key auto_increment,
	name varchar(23),
	cno int,
	foreign key(cno) references t_class(classno)
);
insert into t_class(classno,classname) values(101,'FirstSchool');
insert into t_class(classno,classname) values(102,'SecondSchool');
insert into t_student(name,cno) values('Wang',101);
insert into t_student(name,cno) values('Li',101);
insert into t_student(name,cno) values('Zhang',101);
insert into t_student(name,cno) value('Xiao',102);
insert into t_student(name,cno) values('Ming',102);
insert into t_student(name,cno) values('Tang',102);

在这里插入图片描述
我们尝试插入一条错误的数据

insert into t_student(name,cno) values('He',103);

在这里插入图片描述

4.外键引用的一定是主键吗?

不一定是主键,但一定有unique约束

5.外键值可以为NULL吗?

可以

insert into t_student(name,cno) values('He',NULL);

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值