MySQL報錯Failed to open the referenced table XXX問題
問題復現(xiàn)
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;
外鍵
阿里規(guī)范

源自《阿里巴巴開發(fā)手冊》
實例:
假設刪除微博某V,其粉絲關系表中的百萬條數(shù)據(jù)如果有外鍵約束,就會影響性能。
來自知乎的回答
- 外鍵約束是物理上的“硬綁定”,而表的關聯(lián)只是一種邏輯概念,即數(shù)據(jù)間存在一定的聯(lián)系。數(shù)據(jù)庫通過外鍵建立的“硬綁定”會帶來額外的資源消耗來進行一致性和完整性校驗,盡管有時候無需這些校驗。
- 因此,一般不建議使用外鍵約束來保證數(shù)據(jù)的一致性和完整性。--- 源自知乎
外鍵作用:維護數(shù)據(jù)一致性和完整性,避免借助外部資源(例如:啟用事務)。
何時使用:高并發(fā)大流量事務場景使用外鍵容易造成死鎖,數(shù)據(jù)庫資源會更容易出現(xiàn)瓶頸。一般互聯(lián)網(wǎng)很少使用外鍵。--- 源自知乎
總結(jié)
實際建表時,不建外鍵。
表之間的關聯(lián)可以通過建立索引(咨詢同事得到的答案,后續(xù)會就此問題寫博客解答)。
更新user_role表的創(chuàng)建語句,刪除外鍵。
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';
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 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安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯誤的解決辦法
- MySQL連接拋出Authentication Failed錯誤的分析與解決思路
相關文章
如何在Java程序中訪問mysql數(shù)據(jù)庫中的數(shù)據(jù)并進行簡單的操作
這篇文章主要介紹了如何在Java程序中訪問mysql數(shù)據(jù)庫中的數(shù)據(jù)并進行簡單的操作的相關資料,需要的朋友可以參考下2016-05-05
Mysql出生日期轉(zhuǎn)換為年齡并分組統(tǒng)計人數(shù)的方法示例
這篇文章主要給大家介紹了關于Mysql出生日期轉(zhuǎn)換為年齡并分組統(tǒng)計人數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
mysql 8.0.22壓縮包完整安裝與配置教程圖解(親測安裝有效)
這篇文章主要介紹了mysql 8.0.22壓縮包完整安裝與配置教程圖解(親測安裝有效),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
mysql 8.0.18 安裝配置方法圖文教程(linux)
這篇文章主要介紹了linux下mysql 8.0.18 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11

