为什么需要约束?
数据完整性是指数据的精确性和可靠性。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。从以下四个方面考虑:
什么是约束?
约束是表级的强制规定。
可以在创建表时添加约束(通过create table 语句),或者在表创建之后通过alter table语句添加或删除约束。
约束的分类
#角度一:约束的字段个数
#单列约束vs多列约束
#角度二:约束的作用范围
#列级约束:将此约束声明在对应字段的后面
#表级约束:在表中所有字段都声明完后声明的约束
#角度三:约束的作用(或功能)
#1.not null (非空约束)
#2.unique (唯一性约束)
#3.primary key (主键约束)
#4.foreign key (外键约束)
#5.check (检查约束)
#6.default (默认值约束)
非空约束
关键字not null
特点:
例:
create table t(
id int not null,
name varchar(15) not null,
email varchar(25)
);
在alter table时删除约束
alter table t
modify id int null;
唯一性约束
用来限制某个字段/某列的值不能重复
关键字:unique
特点:
create table t1(
id int unique,#列级约束
name varchar(15),
email varchar(25) unique #列级约束
);
#表级约束
constraint uk_t1_id unique(id) #uk_t1_id为自定义约束名
#若不给约束命名,则默认和列名相同
unique(id)
删除约束时要用到约束名。
可以向声明unique的字段上添加null值,且可添加多个null值。
在alter table中添加约束
#方式一:
alter table t1
add constraint uk_t1_sal unique(salary);
#方式二:
alter table t1
modify name varchar(25) unique;
复合的唯一性约束
create table user(
id int,
name varchar(25),
password varchar(15),
#表级约束
constraint uk_user_name_pwd unique(name,password)
);
只要name和password不同时相同,则可以添加进去。
删除唯一性约束
#drop index 约束名
alter table t1
drop index uk_user_name_pwd;
primary key主键约束
用来唯一标识表中的一行记录。
关键字primary key
特点:主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
在alter table中添加主键约束
alter table t
add primary key(id);
删除主键约束(实际开发中,不会删除表中的主键约束!)
alter table t
drop primary key;
自增列auto_increment
作用:某个字段的值自增
关键字:auto_increment
特点:
在alter table时添加自增列(不常用)
alter table t
modify id int auto_increment;
在alter table中删除自增列
alter table t
modify id int;
注意
开发中,一旦主键作用的字段上声明了auto_increment,则我们添加数据时不要给主键字段赋值了,赋值也没用。因为主键字段会自动从0开始每次+1。
foreign key外键约束
作用:限定表的某个字段的应用完整性。关键字:foreign key
例:要求从表中添加的department_id在主表中能找到,否则添加失败。
主表(父表):被引用的表,被参考的表。
从表(子表):引用别人的表,参考别人的表。
特点:
示例:
修改:给主表的dept_id加上主键约束
alter table dept1
add primary key(dept1_id);
删除外键约束
一个表中可以声明有多个外键约束。
约束等级
开发场景
check约束
作用:检查某个字段的值是否符合xx要求,一般指的是值的范围。
关键字:check
MySQL5.7不支持,可以使用check约束,但对数据验证没有任何作用。添加数据时没有任何错误和警告。但MySQL8.0中支持。
default约束
默认值约束。关键字:default
作用:给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
create table t(
id int default 2000
);
表示:若没给id赋值,则默认值为2000。
在alter table中添加default约束
alter table t1
modify id int default 200;
面试