1. 约束(重要)
1.1 概述
约束对应的英文单词:constraint
在创建表的时候,可以给表中的字段加上一些约束,来保证表中数据的完整性,有效性。
作用:保证表中的数据有效
1.2 种类
非空约束 :(not null)
唯一性约束:(unique)
主键约束 :(primary key)PK
外键约束 :(foreign key)FK
检查约束 :(check)MySQL不支持,Oracle支持
1.3 非空约束:not null
非空约束的字段不能为null
create table t_vip(
id int,
name varchar(255) not null
);
1.4 唯一性约束:unique
唯一性约束unique约束的字段不能重复,但是可以为null
create table t_vip(
id int,
name varchar(255) unique,
email varchar(255)
);
1.5 两个字段联合唯一
新需求,name和email两个字段联合起来具有唯一性
create table t_vip(
id int,
name varchar(255),
email varchar(255),
unique(name,email) // 约束没有添加在列的后面,这种约束被称为表级约束
);
需要给多个字段联合起来添加某一个约束的适合,使用表级约束
not null没有表级约束,只有列级约束
1.6 unique和not null联合约束
被unique和not null 约束之后就成为主键约束。(MySQL这样,Oracle不会)
create table t_vip(
id int,
name varchar(255) not null unique
);
1.7 主键约束 primary key 重要
1.7.1 概述
相关术语:
主键约束:一种约束
主键字段:该字段添加了主键约束,就叫主键字段
主键值:主键字段中的每一个值叫做主键值
- 什么是主键?
- 主键值是每一行记录的唯一标识
1.7.2 添加主键约束
create table t_vip(
// 一个字段主键,叫做单一主键
id int primary key, // 列级约束
name varchar(255)
);
create table t_vip(
// 联合主键
id int, // 列级约束
name varchar(255),
name varchar(255),
primary key(id,name)
);
1.7.3 主键数量
一个表中主键约束只能添加一个
create table t_vip(
id int primary key, // 列级约束
name varchar(255) primary key
);
ERROR;
1.7.4 主键值建议类型
int
bigint
char
等类型
不建议使用varchar。主键值一般都是数字,一般都是定长的。
1.7.5 自然主键和业务主键
自然主键:主键值是一个自然数,和业务没关系。
业务主键:主键值和业务紧密关联。
实际开发中,自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。
主键自增auto_increment可以自动维护一个主键值,从1开始以1自增
create table t_vip(
id int primary key auto_increment, // 列级约束
name varchar(255)
);
1.8 外键约束(foreign key)重要
外键约束相关术语:
- 外键约束:一种约束
- 外键字段:该字段上添加了外键约束
- 外键值:外键字段当中的每一个值
业务背景:
请设计数据库表,来描述“班级和学生”的信息?
第一种方案:班级和学生存储在一张表中
t_student
no(pk) name classno classname
缺点:数据冗余,空间浪费
第二种方案:班级一张表,学生一张表
t_class
classno(pk) classname
t_student
no(pk) name cno(班级编号)
当cno字段没有任何约束的时候,可能会导致数据无效,所以为了保证cno字段中的值,要给cno添加外键约束。那么cno字段值中的每一个值都是外键值。
删表的顺序:先删子,再删父
创表的书序:先创父,再创子
create table t_class(
classno int primary key,
classname varchar(255)
);
create table t_student(
no int primary key auto_increment,
name varchar(255),
cno int,
foreign key(cno) references t_class(classno)
);
insert into t_class(classno,classname) values (1,"一班");
insert into t_class(classno,classname) values (2,"二班");
insert into t_student(name,cno) values ('jack',1);
insert into t_student(name,cno) values ('lucy',2);
外键可以为空!
子表中的外键引用的父表中的某个字段,这个字段不一定是主键,但至少具有unique约束!