一、什么是约束,为什么使用约束
- 约束对应英语单词constraint,约束就是表中数据的限制条件
- 表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
二、约束包括哪些
1、 非空约束 not null
not null约束的字段,不能为NULL值,必须给定具体的数据
2、 唯一性约束 unique
unique约束的字段具有唯一性,不可重复,但是可以为NULL
使用表级约束可以给多个字段联合添加约束,表示两个字段联合唯一
例:
create table t_test(
id int(10),
unqiue(name,email)
);
2.2 表级约束还可以给约束起名字,有了名字之后可以通过名字删除这个约束
例:
create table t_user(
id int(10),
name varchar(128),
constraint t_user_email_unique unique(email)
);
这个email的约束名字叫做:t_user_email_unique
2.3 查询约束的名字
show database;
然后use information_schema;
show tables; 一个叫TABLE_CONSTRAINTS的表记录约束信息的
3、 主键约束 primary key,简称PK
3.1 给某个字段添加主键约束primary key之后,该字段不能重复,而且不能为空,效果和"not null unique"约束相同,但 是本质不同,主键约束除了可以做到"not null unique"之外,主键字段还会默认添加"索引-index"。
3.2 一张表应该有主键字段,若没有,表示这张表是无效的。
3.3 "主键值"是当前行数据的唯一标识。"主键值"是当前行数据的"身份证号"。
3.4 给一个字段添加主键约束,被称为单一主键。
// 单一主键,列级约束
create table t_user(
id int(10) primary key;
name varvhar(32)
);
// 单一主键,表级约束
create table t_user(
id int(10);
name varvhar(32),
primary key(id)
);
3.5 给多大字段添加一个主键约束,被称为复合主键。
// 复合主题,表级约束
create table t_user(
id int(10);
name varvhar(32),
primary key(id,name)
// 复合主题,表级约束,起别名
create table t_user(
id int(10);
name varvhar(32),
constraint t_user_id_name_pk primary key(id,name)
);
3.6 无论是单一主键还是复合主键,一张表的约束只能有一个。
3.7 主键根据性质分类:
- 自然主键
* 主键值若失一个自然数,这个自然数和当前表的业务没有任何关系,这种主键叫做自然主键
- 业务主键
* 主键值若和当前表中业务紧密相关的,那么这种主键值被称为业务主键,当业务数据发生改变的时候,主键值通常会受到影响,所以业 务主键使用较少,大部门都是自然主键
3.8 在mysql数据库管理系统中提供了一个自增的数字,专门用来自动生成主键值。主键值不需要用户维护,也不需要用户提供,自动生成。这个自增的数字默认从1开始。
关键字 auto_increment
4、 外键约束 foreign key-简称FK
4.1 外键分为单一外键(给一个字段添加外键约束)和复合外键(给多个字段联合添加一个外键)
- 4.2 一张表可以有多个外键字段
4.3 外键字段可以为空
4.4 被引用的字段必须具有唯一性,unique约束(可以不是主键)
4.5 有了外键引用之后,表分为父表和子表;如果a表引用了b表的某个字段,则a表为子表,b表为父表。创建表的时候 先创建父表,再创建子表;删除数据的时候先删除子表中的数据,再删除父表中的数据。插入数据的时候先插入父 表中的数据,再插入子表中的数据。
4.6 外键实例
create table b(
cno int(3) primary key,
cname varchar(128) not null unique
);
create table a(
sno int(3) primary key,
sname varchar(32) not null,
classno int(3),
constraint t_student_class_fk foregin key(classno) references b(cno)
);
4.7 级联更新和级联删除
-- 在删除父表中数据的时候,级联删除子表中的数据
级联删除建立:
alter table t_student
add constraint fk_classes_id_1 foreign key(classes_id) references t_classes(classes_id)
on update cascade;
5、defalt,默认值约束