-- 创建表时添加外键约束 CREATE TABLE 表名( 列名 数据类型, … [CONSTRAINT ] [外键取名名称] FOREIGN KEY (外键列名) REFERENCES 主表(主表列名) ); -- 创建表时添加外键约束,constraint译作限制,束缚;references译作关联,参考,提及 create table 表名( 列名 数据类型, … [constraint ] [外键取名名称] foreign key (外键列名) references 主表(主表列名) ); -- 建完表后添加外键约束 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); -- 建完表后添加外键约束 alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称);
删除外键约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 删除表 DROP TABLE IF EXISTS emp;DROP TABLE IF EXISTS dept; -- 部门表 CREATE TABLE dept( id int primary key auto_increment, dep_name varchar (20 ), addr varchar (20 ) );-- 员工表 CREATE TABLE emp( id int primary key auto_increment, name varchar (20 ), age int , dep_id int , -- 添加外键 dep_id,关联 dept 表的id主键 CONSTRAINT fk_emp_dept FOREIGN KEY (dep_id) REFERENCES dept(id ) );
添加数据
-- 添加 2 个部门 insert into dept(dep_name,addr) values ('研发部' ,'广州' ),('销售部' , '深圳' );-- 添加员工,dep_id 表示员工所在的部门 INSERT INTO emp (name , age, dep_id) VALUES ('张三' , 20 , 1 ), ('李四' , 20 , 1 ), ('王五' , 20 , 1 ), ('赵六' , 20 , 2 ), ('孙七' , 22 , 2 ), ('周八' , 18 , 2 );
此时删除 研发部 这条数据,会发现无法删除。
DELETE FROM dept WHERE id =1
删除外键
alter table emp drop FOREIGN key fk_emp_dept;
此时删除 研发部 这条数据,会发现删除成功:
DELETE FROM dept WHERE id =1
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key (dep_id) REFERENCES dept(id );
SELECT COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'emp' AND REFERENCED_TABLE_NAME IS NOT NULL ;
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
视频教程:https://doc.iocoder.cn/video/
改、删时要考虑外键:
每次做DELETE 或者UPDATE都必须考虑外键约束,不方便。
表级锁导致并发差:
并发问题外键约束会启用行级锁主表写入时会进入阻塞
级联删除问题:
删除主表的一条记录,该记录外键关联的从表记录也会随之删除,导致数据不可控。例如删除“订单表”的一条订单,关联的“订单详情表”的一条记录也会随之删除。
耦合高、迁移麻烦:
主表从表之间互相耦合,主表数据量过大要分表并迁移数据时,就必须先删除外键,不然你刚删完主表的一条记录,从表关联记录也级联删除了,导致数据丢失。