目录
一、约束介绍
MySQL约束:在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表的列(字段)中的数据进行限制)
表中的列(字段)添加约束有以下意义:
(1)保证数据的有效性(2)保证数据的完整性(3)保证数据的正确性
字段常⻅的约束:
⾮空约束(not null):限制此列的值必须提供,不能为null(空值)
唯⼀约束(unique):在表中的多条数据,此列的值不能重复
主键约束(primary key):⾮空+唯⼀,能够唯⼀标识数据表中的⼀条数据
外键约束(foreign key):建⽴不同表之间的关联关系
二、非空约束
非空约束:被定义列(字段)的数据不能为空值,在适用DML语言进行数据插入时被定义列(字段)未指定值时,系统报错。
以创建图书表为例:设置图书表的 book_name not null
##最后定义字段后不用加逗号
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varchar(6)
);
对表添加数据,表内制定了非空约束的字段(列:book_name),我们通过客户端NAVICAT进行字段添加的时候会出现book_name字段添加错误。
三、主键约束
主键约束:数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性 。
主键作用:用于其他表的外键关联,以及本记录的修改与删除。主键是能确定一条记录的唯一标识,主键字段必须唯一,必须非空,一个表中只能有一个主键,主键可以包含一个或多个字段。打个比方,一条记录包括身份正号,姓名,年龄,学校,国籍,性别等。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
主键字段的特性:被定义字段不能为空值(null);字段数据不能重复。
(1)添加主键约束
以创建图书表为例:设置图书表的 book_isbn primary key(主键)
create table books(
book_isbn char(4) primary key,
book_name varchar(10) not null,
book_author varchar(6)
);
##另一种写法:将主键字段定义写在最后单独成语句
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varchar(6),
primary key(book_isbn)
);
在Navicat中通过desc语句进行对创建表的查询
(2)删除主键约束
删除books表中的主键约束:
alter table books drop primary key;
在Navicat中用desc语句进行对创建表的查询
(3)创建表之后为表添加主键约束
## 创建表时没有添加主键约束
create table books(
book_isbn char(4),
book_name varchar(10) not null,
book_author varchar(6)
);
## 创建表之后添加主键约束
alter table books modify book_isbn char(4) primary key;
运行代码块后在进行表格式的查询后发现表和直接添加主键的结果一样。
(4)主键自动增长
在我们创建⼀张数据表时,如果数据表中有列可以作为主键(例如:学⽣表的学号、图
书表的isbn)我们可以直接这是这个列为主键;
当有些数据表中没有合适的列作为主键时,我们可以额外定义⼀个与记录本身⽆关的列
(ID)作为主键,此列数据⽆具体的含义主要⽤于标识⼀条记录,在mysql中我们可以
将此列定义为int,同时设置为 ⾃动增⻓ ,当我们向数据表中新增⼀条记录时,⽆需提供
ID列的值,它会⾃动⽣成。
列如:对给定字段(id)设置成自动生成。
create table types(
id int primary key auto_increment,
name varchar(20) not null,
remark varchar(100)
);
添加主键自动增长后查询数据表的格式如下:
我们通过DML语言(数据操纵语言)对数据库插入数据
insert into types (name,remark) VALUES ('张三','非常好'),('王五','一级棒');
查看数据表文件,我们发小,我们在添加数据时并没有添加id字段的数据,但是表中自动生成了表的数据
注意:⾃动增⻓从1开始,每添加⼀条记录,⾃动的增⻓的列会⾃定+1,当我们把某条记录删
除之后再添加数据,⾃动增⻓的数据也不会重复⽣成(⾃动增⻓只保证唯⼀性、不保证连续
性)
(4)联合主键
联合主键:在约束条件中除去单独主键之外,还有联合主键,将数据表中的多列组合在⼀起设置为表的主键。但是在实际企业项⽬的数据库设计中,联合主键使⽤频率并不⾼;当⼀个张数据表中没有明确的字段可以作为主键时,我们可以额外添加⼀个ID字段作为主键。
定义联合主键:
定义语句如下:
create table grades(
stu_num char(8),
course_id int,
score int,
primary key(stu_num,course_id)
);
创建以后我们还是通过desc对表进行查看
四、外键约束
外键约束:将⼀个列添加外键约束与另⼀张表的主键(唯⼀列)进⾏关联之后,这个外键
约束的列添加的数据必须要在关联的主键字段中存在。通俗的讲就是在主键表中的主键字段与另外一张外键表的外键字段有关联。(注:一张表可以主键和外键同时存在)
(1)外键约束的创建
在此我们通过学生表与班级表创建主外键约束进行案例演示:
先创建班级表
create table classes(
class_id int primary key auto_increment,
class_name varchar(40) not null unique,
class_remark varchar(200)
);
再创建学⽣表(在学⽣表中添加外键与班级表的主键进⾏关联)
##方法一:在创建表的时候,定义cid字段,并添加外键约束
# 由于cid 列 要与classes表的class_id进⾏关联,因此cid字段类型和⻓度要与
class_id⼀致
create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
cid int,
constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id)
);
##方法二:先创建表,再添加外键约束
create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
cid int
);
# 在创建表之后,为cid添加外键约束
alter table students add constraint FK_STUDENTS_CLASSES foreign
key(cid) references classes(class_id);
创建过后我们可以通过查看表格格式信息,查看创建的主外键信息
学生表
班级表
至此我们在学生表里观测到字段cid对班级表中的class_id进行了关联,但我们在此会想一个问题,这个外键创建了后有什么作用?下面我们会讲解外键约束的实际运用
(2)外键约束在实际中的运用
主表:对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。
从表:对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表
定义一个外键时,需要遵守下列规则:
- 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
- 必须为父表定义主键。
- 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
- 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
- 外键中列的数目必须和父表的主键中列的数目相同。
- 外键中列的数据类型必须和父表主键中对应列的数据类型相同
我们对上述学生表和班级表添加数据
##向班级表添加信息
insert into classes(class_name,class_remark)
values('Java2104','...'),('Java2105','...'),('Java2106','...'),('Python2106','...');
##向学生表添加信息
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210102','李斯','⼥',20, 4 );
# 添加学⽣时,设置给cid外键列的值必须在其关联的主表classes的classs_id列存在
insert into students(stu_num,stu_name,stu_gender,stu_age,cid)
values('20210103','王五','男',20, 6 );
我们先对班级表进行信息添加,添加的信息如下:
此时我们需要知道的是学生信息表(students)的cid外键的值与关联主表classes的class_id的值相互关联,因此在上述照片中class_id是1、2、3、4,因此我们在添加数据的时候进行了cid=6的值的添加,此时就会报错。
因此对于外键约束,当我们在表中设计了外键约束,此时设置的外键的值必须与外键关联表的字段的值一致。 这就是外键约束的运用,外键约束保证了表与表之间的完整性,准确性,避免了多关系性数据表的数据的不一致。
补充!!!
删除外键约束操作语句:
alter table students drop foreign key FK_STUDENTS_CLASSES;