当前位置: 代码网 > it编程>数据库>Mysql > MySQL报错Failed to open the referenced table XXX问题

MySQL报错Failed to open the referenced table XXX问题

2024年11月06日 Mysql 我要评论
问题复现create table `master_role` ( `id` integer not null auto_increment comment 'id', `role` varchar

问题复现

create table `master_role` (
  `id` integer not null auto_increment comment 'id',
  `role` varchar(50) character set latin1 not null comment 'role',
  `active` tinyint not null comment 'active',
  primary key (`id`)
)
engine = innodb
default charset=utf8mb4
comment = 'master role';
create table `user_role` (
  `id` integer not null auto_increment comment 'id',
  `email` varchar(150) not null comment 'email',
  `role_id` integer not null comment 'role id',
  primary key (`id`),
  key `fk_user_role_idx` (`role_id`),
  constraint `fk_user_role` foreign key (`role_id`) references `master_role` (`id`) on delete no action on update no action
)
engine = innodb
default charset=utf8mb4
comment = 'user role';

step1: create table master_role

step2: create table user_role

step3: drop table if exists master_role;

error code: 3730. cannot drop table 'master_role' referenced by a foreign key constraint 'fk_user_role' on table 'user_role'.

解决方案

方案一:关闭外键检查

set foreign_key_checks=0;  # 关闭外键检查
drop table course;
set foreign_key_checks=1;  # 开启外键检查

关闭检查之后,如果下次还要使用外键就要再次打开检查,较为繁琐。

方案二:删除外键

#user_role表删除外键
alter table user_role drop foreign key fk_user_role;
#删表
drop table if exists master_role;

外键

阿里规范

源自《阿里巴巴开发手册》

实例:

假设删除微博某v,其粉丝关系表中的百万条数据如果有外键约束,就会影响性能。

来自知乎的回答

  • 外键约束是物理上的“硬绑定”,而表的关联只是一种逻辑概念,即数据间存在一定的联系。数据库通过外键建立的“硬绑定”会带来额外的资源消耗来进行一致性和完整性校验,尽管有时候无需这些校验。
  • 因此,一般不建议使用外键约束来保证数据的一致性和完整性。--- 源自知乎

外键作用:维护数据一致性和完整性,避免借助外部资源(例如:启用事务)。

何时使用:高并发大流量事务场景使用外键容易造成死锁,数据库资源会更容易出现瓶颈。一般互联网很少使用外键。--- 源自知乎

总结

实际建表时,不建外键。

表之间的关联可以通过建立索引(咨询同事得到的答案,后续会就此问题写博客解答)。

更新user_role表的创建语句,删除外键。

create table `user_role` (
  `id` integer not null auto_increment comment 'id',
  `email` varchar(150) not null comment 'email',
  `role_id` integer not null comment 'role id',
  primary key (`id`)
)
engine = innodb
default charset=utf8mb4
comment = 'user role';

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com