目录
🍀🍀🍀
引言:完整性约束概念
完整性约束条件是对字段进行限制,要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件,数据库系统将不再执行用户的操作。MySQL中基本的完整性约束条件如👇表所示。下表是完整性约束条件:
一、设置表字段的主键约束(PRIMARY KEY,PK)
主键是表的一个特殊字段,能唯一标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证用来表明人的身份,每个人都具有唯一的身份证号。设置表的主键是指在创建表时设置表的某个字段为该表的主键。
主键的主要目的是帮助数据库管理系统以最快的速度查找到表的某一条信息。主键必须满足的条件就是主键必须是唯一的,表中任意两条记录的主键字段的值不能相同,并且是非空值。主键可以是单一的字段,也可以是多个字段的组合。
1.1单字段主键
单字段主键的语法规则如下:
CREATE TABLE tablename(
propName propType PRIMARY KEY, ......
);
或
CREATE TABLE tablename(
propName propType , ......
PRIMARY KEY(propType)
);
创建表class,设置id字段为PK约束,再查看class表信息,SQL语句如下
create table class(id int primary key,name varchar(128) ,teacher varchar(64));
desc class;
设置成主键后,该字段会自动加上not null;
插入重复数据时则会报错;
Mysql 支持给主键设置名字:
CREATE TABLE tablename(
propName propType , ......
CONSTRAINT pk_name PRIMARY KEY(propType)
);
给id字段的PK约束设置一个名字,可以执行SQL语句CONSTRAINT。创建表class:
create table class (id int ,
name varchar(128) ,
teacher varchar(128) ,
constraint id_pk primary key(id)
);
1.2多字段主键
主键是由多个属性组合而成时,在属性定义完之后统一设置主键。语法规则如下:
CREATE TABLE tablename(
propName1 propType ,
propName2 propType ,
......
[CONSTRAINT pk_name]PRIMARY KEY(propName1, propName2)
);
多字段主键设置
create table class (id int ,
name varchar(128) ,
teacher varchar(128) ,
constraint id_pk primary key(id,name)
);
联合主键只需要其中至少一个键不重复即可
insert into class values(1,'三年级','老王');
insert into class values(1,'四年级','老李');
当插入重复的联合主键时则会报错
二.设置表字段的外键约束(FOREIGN KEY,FK)
外键是表的一个特殊字段,外键约束是为了保证多个表(通常为两个表)之间的参照完整性,即构建两个表的字段之间的参照关系。
设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。例如,表示一个班级和学生关系,即每个班级有多个学生。首先应该有两个表:班级表和学生表,然后学生表有一个表示班级编号的字段no,其依赖于班级表的主键,这样字段no就是学生表的外键,通过该字段班级表和学生表建立了关系。
-
一个班级表:
ID | 名称 | 班主任 |
101 | 六年级一班 | 马老师 |
102 | 六年级二班 | 潘老师 |
- 一个学生表
ID | 姓名 | 班级ID | 性别 | 年龄 |
1 | 小花 | 101 | M | 9 |
2 | 小红 | 102 | F | 8 |
3 | 小军 | 102 | M | 8 |
4 | 小白 | 101 | F | 9 |
每一行对应着一个班级,而一个班级对应着多个学生,所以班级表和学生表的关系就是“一对多”
在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为空(NULL)。
设置表中某字段的FK约束非常简单,可以在MySQL数据库管理系统中通过SQL语句FOREIGN KEY来实现,其语法形式如下:
CREATE TABLE tablename_1( propName1 propType , propName2 propType , ...... [CONSTRAINT fk_name]FOREIGN KEY(propName1) REFERENCES table2_name(table2_column) );
其中,tablename_1参数是要设置外键的表名,propName1参数是要设置外键的字段,table2_name是父表的名称,table2_column是父表中设置主键约束的字段名。
SQL语句演示
create table class (
id int primary key ,
name varchar(128),
teacher varchar(64)
);
create table student (
id int primary key auto_increment,
name varchar(64) not null,
class_id int,
sex enum('M','F'),
foreign key(class_id) references class(id)
);
设置了外键约束后,子表就需要根据父类外键插入记录,否则会插入失败,子表中的外键可以为空
insert into class values(1001,'三年二班','老王');
insert into student values(1,'小张',1001,'M'),(2,'小王',1001,2);
insert into student (name,sex) values('小丽',2);
但是当父类没有这个外键时,向子表插入数据则会报错