开发者

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

开发者 https://www.devze.com 2024-11-07 09:05 出处:网络 作者: A_bad_horse
目录问题复现解决方案方案一:关闭外键检查方案二:删除外键外键阿里规范来自知乎的回答总结问题复现
目录
  • 问题复现
  • 解决方案
    • 方案一:关闭外键检查
    • 方案二:删除外键
  • 外键
    • 阿里规范
    • 来自知乎的回答
  • 总结

    问题复现

    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` INTjavascriptEGER 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 Co编程客栈de: 3730. Cannot drop tablpythone 'master_role' referenced by a foreign key constraint 'fk_user_role' on table 'user_role'.

    解决方案

    方案一:关闭外键检查

    SET fo编程reign_key_checks=0;  # 关闭外键检查
    DROP TABLE Course;
    SET foreign_key_checks=1;  # 开启外键检查

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

    方案二:删除外键

    #user_role表删除外键
    ALTER TABLE user_role DROP FOR编程客栈EIGN KEY fk_user_role;
    #删表
    DROP TABLE IF EXISTS master_role;

    外键

    阿里规范

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

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

    实例:

    假设删除微博某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';

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号