1、数据库约束的认识
数据库约束的概念:数据库的约束是关系型数据库的一个重要的功能,它提供了一种“校验数据”合法性的机制,能够保证数据的“完整性”、“准确性”和“正确性”
数据库的约束:
not null:不能存储 null 值
unique:保证某列的每行必须有唯一值
default:规定没有给列赋值时的默认值
primary key:主键,相当于 not null 和 unique 的结合,每条记录的身份标识
aoto_increment:自动添加主键值,也可以手动添加
foreign key:外键,多个表的关联关系,要求某个记录必须在另外一个表里存在
2、not null 约束
创建一个student表,表中有两列,分别是: id 类型为 int 约束为 not null,name 类型为varchar 最大存储 20 字符
-- 如果已有student表,请先删除,因为同一个库里面不能存在相同名的表
create table student(id int not null,name varchar(20));
id 的约束为not null,说明 id 列不能为空
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
查看student表的结构也就可以发现 id 行 Null 列为 NO,也就说明 id 列不能为 NULL
3、unique 约束
创建一个student表,表中有两列,分别是: id 类型为 int 约束为 unique,name 类型为varchar 最大存储 20 字符
-- 如果已有student表,请先删除,因为同一个库里面不能存在相同名的表
create table student(id int unique,name varchar(20));
id 的约束为 unique ,必须是唯一的、不能重复
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
查看student表的结构也就可以发现 id 行 key 列的为 UNI,也就说明 id 必须唯一不能重复
4、default 约束
创建一个student表,表中有两列,分别是: id 类型为 int ,name 类型为varchar 最大存储 20 字符约束为 default
-- 如果已有student表,请先删除,因为同一个库里面不能存在相同名的表
create table student(id int,name varchar(20) default 'unkown');
name 的约束为 default ,当不给 name 添加内容的时候,默认为 unkown
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | unkown | |
+-------+-------------+------+-----+---------+-------+
查看student表的结构也就可以发现 name 行 Default 列的为 unkown,也就说明当不给 name 添加内容的时候默认为 unkown
5、primary key 约束
创建一个student表,表中有两列,分别是: id 类型为 int 约束为 primary ,name 类型为varchar 最大存储 20 字符
-- 如果已有student表,请先删除,因为同一个库里面不能存在相同名的表
create table student(id int primary key,name varchar(20));
id 的约束为 primary key,说明id为主键,主键就相当于 not null 和 unique 的结合,不能为空、不能重复
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
查看student 表的结构也就可以发现 id 行 Null 列为 NO,id 行 Key 列为 PRI,说明 id 不能为空、不能重复
当我们创建 student 表的时候,将 id 设置为 not null 和 unique 的时候,也就等于 primary key
-- 如果已有student表,请先删除,因为同一个库里面不能存在相同名的表
create table student(id int not null unique,name varchar(20));
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
当把 id 的约束设置为 not null 和 unique 的时候,查看student 表结构的时候,发现跟约束为primary key的结构一样
6、auto_increment 约束
对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大 值+1
create table student(id int primary key auto_increment,name varchar(20));
desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
当把 id 的约束设置为 primary key 和 auto_increment 的时候,不给 id 添加内容时默认是最大值+1
当我们光给这个表中的name列添加内容时
create table student(id int primary key auto_increment,name varchar(20));
select * from student;
+----+------+
| id | name |
+----+------+
| 1 | 张三 |
| 2 | 李四 |
+----+------+
id 列会默认添加值,且是最大值+1
7、foreign key 约束
外键用于关联其他表的主键和唯一值,让两个表之间产生约束,语法:
foreign key (字段名) references 主表(列)
先创建一个class班级表:
create table class(id int primary key auto_increment,className varchar(20));
class 表中有两个列,分别为:
id 列,类型为 int,约束为 primary key 和 auto increment
className 列,类型为 varchar 最多存储 20字符
先创建一个 student 学生表:
create table student(id int primary key auto_increment,
classId int ,
name varchar(20),
foreign key (classId) references class (id));
student 表中有三个列,分别为:
id 列,类型为 int,约束为 primary key 和 auto increment
classId 列,类型为 int
name 列,类型为 varchar 最多存储 20字符
classId为外键与class表中的id 产生约束
学生表中的数据,要依赖班级表的数据,班级表的数据要对学生表产生约束力
此处起到约束作用的班级表,就叫做“父表”;被约束的这个表,就叫做“子表”
给class表添加一些内容:
insert into class (className) values('Java'),('C'),('python');
给student表添加一些内容:
insert into student (classId,name) values(1,'张三'),(1,'李四'),(2,'王五'),(3,'赵六');