文章目录
- 约束(constraint)
- 列级约束和表级约束
- 给约束起名字(constraint)
- 非空约束(no null)
- 检查约束(check)
- 唯一性约束 (unique)
- 主键约束 (primary key)
- 主键分类
- 单一主键
- 复合主键
- 主键自增 (auto_increment)
- 外键约束
- 外什么用外键
- 级联删除
- 级联更新
- 级联置空
- 注意点
约束(constraint)
列级约束和表级约束
列级约束
直接在字段后面是列级约束
create table test (
id int 约束1 约束2.....,
name varchar(20) 约束1 约束2....
);
表级约束
定义完,再约束是表记约束。比如联合不能重复的时候就要用到
create table test (
id int,
name varchar(20),
//这里表示 id 和 name联合不能重复
unique(id, name)
);
给约束起名字(constraint)
create table test (
id int,
name varchar(20),
//这里给 unique 起别名,方便删除
constraint 别名 unique(id, name)
);
约束的描述信息,在information_schema 库中的 table_constraints表中
非空约束(no null)
create table test (
id int.
name varchar(255) not nul;
);
//表示 name 字段不能为空
检查约束(check)
create table test (
id int,
name varchar(255),
age int check(age > 18)
);
//表示 age 必须 大于 18
唯一性约束 (unique)
create table test(
no int,
name varchar(100),
email varchar(100),
unique(name, email)
);
//把 email 和 name 设置成联合唯一性的,不能插入重复的,除了NULL
主键约束 (primary key)
- 主键约束的字段不能为NULL,并且不能重复。
- 任何一张表都应该有主键,没有主键的表可以视为无效表。
- 主键值是这行记录的唯一标识。在数据库表中即使两条数据一模一样,但由于主键值不同,我们也会认为是两条完全的不同的数据。
主键分类
- 根据字段数量分类:
- 单一主键(1个字段作为主键)【建议】
- 复合主键(2个或2个以上的字段作为主键)
- 根据业务分类:
- 自然主键(主键和任何业务都无关,只是一个单纯的自然数据)【建议】
- 业务主键(主键和业务挂钩,例如:银行卡账号作为主键)
单一主键
create table test (
uid int primary key,
nno varchar(100) unique,
name varchar(100) not null
)
//把 uid 设置为主键
复合主键
create table test (
uid int,
nno varchar(100) unique,
name varchar(100) not null,
primary key(uid, nno)
)
//把 uid 和 nno 设置成联合主键
不建议使用
主键自增 (auto_increment)
主键自增:既然主键值是一个自然的数字,mysql为主键值提供了一种自增机制,不需要我们程序员维护,mysql自动维护该字段
create table test (
no int primary key auto_increment,
name varchar(20)
);
外键约束
create table t_school(
sno int primary key,
sname varchar(255)
);
create table t_student(
no int primary key,
name varchar(255),
age int,
sno int,
//constraint 是起别名,foreign key...references 是外键
constraint t_school_sno_fk foreign key(sno) references t_school(sno)
);
//外键不一定是主键,也可以是父表中具有唯一性的字段
外什么用外键
图片来源:动力节点
这种情况比较浪费空间直接两张表,然后设置外键
表一
图片来源:动力节点
表二
图片来源:动力节点
级联删除
创建子表时,外键可以添加:on delete cascade,这样在删除父表数据时,子表会级联删除。谨慎使用。
create table t_student(
no int primary key,
name varchar(255),
age int,
sno int,
constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete cascade
);
###删除约束
alert table t_student drop foreign key t_student_sno_fk;
###添加约束
alert table t_student add constraint t_student_sno_fk foreign key(sno) references t_school(sno) on delete cascade;
级联更新
创建子表时,外键可以添加:on update cascade ,这样在修改父表数据时,子表会级联修改,谨慎使用。
create table t_student(
no int primary key,
name varchar(255),
age int,
sno int,
constraint t_school_sno_fk foreign key(sno) references t_school(sno) on update cascade
);
级联置空
创建子表时,外键可以添加:on delete set null,父数据设置成 null ,子表会级联设置为 null ,谨慎使用。
create table t_student(
no int primary key,
name varchar(255),
age int,
sno int,
constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete set null
);
注意点
- 添加了外键约束的字段中的数据必须来自其他字段,不能随便填。
- 假设给a字段添加了外键约束,要求a字段中的数据必须来自b字段,b字段不一定是主键,但至少要有唯一性。
- 外键约束可以给单个字段添加,叫做单一外键。也可以给多个字段联合添加,叫做复合外键。复合外键很少用。
a 表 如果引用 b 表 中的数据,可以把 b表 叫做 父表 ,把 a 表 叫做 子表。
- 创建表时,先创建父表,再创建子表。
- 插入数据时,先插入父表,在插入子表。
- 删除数据时,先删除子表,再删除父表。
- 删除表时,先删除子表,再删除父表。
插入就先父,删除先子