解决MySQL报Failed to open the referenced table XXX的问题

AI 概述
问题复现解决方案方案一:关闭外键检查方案二:删除外键外键阿里规范来自知乎的回答总结 在数据库操作中,尝试删除外键约束表’master_role’时遇到错误码 3730,因其被’user_role’表中的外键’fk_user_role’引用,解决方法包括关闭外键检查和删除外键。 问题复现 C...
目录
文章目录隐藏
  1. 问题复现
  2. 解决方案
  3. 外键
  4. 总结

解决 MySQL 报 Failed to open the referenced table XXX 的问题

在数据库操作中,尝试删除外键约束表’master_role’时遇到错误码 3730,因其被’user_role’表中的外键’fk_user_role’引用,解决方法包括关闭外键检查和删除外键。

问题复现

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';

上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

以上关于解决MySQL报Failed to open the referenced table XXX的问题的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 解决MySQL报Failed to open the referenced table XXX的问题

发表回复