MySQL学习笔记(11)--外键
程序员文章站
2022-06-01 09:13:12
...
·概念
foreign key,外面的键(键不在自己表中):
如果A表中有一个字段(非主键)指向B表的主键,那么将该子段称之为外键。A表被称为从表,B表被称为主表。
·外键操作
·增加外键
1.创建表的时候增加外键
[constraint `外键名`] foreign key (外键字段) references 主表(主键)
--实例
create table my_foreign(
id int primary key auto_increment,
name varchar(10) not null,
class_id int,
-- 增加外键,关联my_class的主键字段id
foreign key (class_id) references my_class(id)
);
desc my_foreign;
MUL:多索引,外键本身是一个索引,外键还要求外键字段本身也是一种普通索引
show create table my_foreign;
2.在创建表后增加外键
alter table 从表 add [constraint `外键名`] foreign key(外键字段) references 主表(主键);
--实例
alter table my_foreign add [constraint `student_class_ibfk_1`] foreign key (class_id) references my_class(id);
--效果同上
·修改&删除外键
事实上,外键不允许修改,只能删除再增加
alter table 从表 drop foreign key 外键名;
--实例
alter table my_foreign drop foreign key `my_foreign_ibfk_1`;
删除普通索引:
alter table 表名 drop index 索引名字;
·外键基本要求
- 外键字段需要保证与关联的主键字段类型完全一致
- 基本属性也要相同
- 外键只能使用innodb存储引擎,myisam不支持
·外键约束
通过建立外键关系之后,对主表和从表会有一定的数据约束。
·约束的基本概念
- 不能在从表中插入主表不存在的数据
- 不能在主表中删除从表已有的数据
insert into my_foreign values(null,'ykk',5); -- 插入失败,主表没有5班
insert into my_foreign values(null,'ykk',2); -- 插入成功
delete from my_class where id = 2; -- 删除失败,从表已经有对应数据了
·外键约束的概念
可以在创建外键的时候,对外键约束进行选择性的操作。
add foreign key (外键字段) references 主表 (主键) on 约束模式;
约束模式(约束对象主要是主表):
- District:严格模式(默认的),主表不能删除或者更新一个已经被从表数据引用的记录
- Cascade:级联模式,主表变化,从表数据也变化
- Set null:置空模式,主表的操作之后(删除),从表对应的数据(外键字段)被置空,前提是外键字段允许为空
通常进行约束使用的时候,需要指定操作:update 和 delete
常用的约束模式:
on update cascade on delete set null -- 更新级联,删除置空
·约束作用
保证数据完整性:主表与从表的数据要一致
正因为外键有非常强的数据约束,而且可能会导致数据在后台变化的不可控。导致程序在进行设计开发逻辑的时候,没有办法很好得把握数据,所以外键较少使用。