文章目录
约束
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)
unique和not 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.什么是主键,有什么作用
主键值是每一行记录的唯一标识,用来区分除主键字段外相同的记录
假设表中有以下数据,该如何区分。
name | sex |
---|---|
Wang | 男 |
Wang | 男 |
给表中加个主键字段就行,如下表
id | name | sex |
---|---|---|
1 | Wang | 男 |
2 | Wang | 男 |
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!任何一张表都应该有主键,没有主键的表无效!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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.什么时候使用外键
假设一个业务背景:要求设计数据库表,来存储“班级”和“学生”的信息
方案一 :将学生和班级存储在一张表中
no | name | classno | classname |
---|---|---|---|
1 | Wang | 101 | FirstSchool |
2 | Li | 101 | FirstSchool |
3 | Zhang | 101 | FirstSchool |
4 | Xiao | 102 | SecondSchool |
5 | Ming | 102 | SecondSchool |
6 | Tang | 102 | SecondSchool |
这种方案可以实现业务要求,但是这种设计方式会导致数据冗余,空间浪费,就像上表中重复出现的FirstSchool和SecondSchool。
方案二:分别设计学生表(t_student)和班级表(t_class)
t_student:
no | name | cno |
---|---|---|
1 | Wang | 101 |
2 | Li | 101 |
3 | Zhang | 101 |
4 | Xiao | 102 |
5 | Ming | 102 |
6 | Tang | 102 |
t_class:
classno | classname |
---|---|
101 | FirstSchool |
102 | SecondSchool |
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);