MySQL报错Failed to open the referenced table XXX问题
作者:A_bad_horse
在数据库操作中,尝试删除外键约束表'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 restart mysql.service: unit not found
- mysql报错ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost解决方式
- mysql启动报错Failed to start LSB:start and stop MySQL的问题解决
- MySQL安装出现The configuration for MySQL Server 8.0.28 has failed. You can...错误的解决办法
- MySQL连接抛出Authentication Failed错误的分析与解决思路