MySQL報(bào)錯(cuò)Failed to open the referenced table XXX問題
問題復(fù)現(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'.
解決方案
方案一:關(guān)閉外鍵檢查
SET foreign_key_checks=0; # 關(guān)閉外鍵檢查 DROP TABLE Course; SET foreign_key_checks=1; # 開啟外鍵檢查
關(guān)閉檢查之后,如果下次還要使用外鍵就要再次打開檢查,較為繁瑣。
方案二:刪除外鍵
#user_role表刪除外鍵 ALTER TABLE user_role DROP FOREIGN KEY fk_user_role; #刪表 DROP TABLE IF EXISTS master_role;
外鍵
阿里規(guī)范
源自《阿里巴巴開發(fā)手冊(cè)》
實(shí)例:
假設(shè)刪除微博某V,其粉絲關(guān)系表中的百萬條數(shù)據(jù)如果有外鍵約束,就會(huì)影響性能。
來自知乎的回答
- 外鍵約束是物理上的“硬綁定”,而表的關(guān)聯(lián)只是一種邏輯概念,即數(shù)據(jù)間存在一定的聯(lián)系。數(shù)據(jù)庫通過外鍵建立的“硬綁定”會(huì)帶來額外的資源消耗來進(jìn)行一致性和完整性校驗(yàn),盡管有時(shí)候無需這些校驗(yàn)。
- 因此,一般不建議使用外鍵約束來保證數(shù)據(jù)的一致性和完整性。--- 源自知乎
外鍵作用:維護(hù)數(shù)據(jù)一致性和完整性,避免借助外部資源(例如:?jiǎn)⒂檬聞?wù))。
何時(shí)使用:高并發(fā)大流量事務(wù)場(chǎng)景使用外鍵容易造成死鎖,數(shù)據(jù)庫資源會(huì)更容易出現(xiàn)瓶頸。一般互聯(lián)網(wǎng)很少使用外鍵。--- 源自知乎
總結(jié)
實(shí)際建表時(shí),不建外鍵。
表之間的關(guān)聯(lián)可以通過建立索引(咨詢同事得到的答案,后續(xù)會(huì)就此問題寫博客解答)。
更新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';
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MySQL服務(wù)無法啟動(dòng):failed to restart mysql.service: unit not found
- mysql報(bào)錯(cuò)ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost解決方式
- mysql啟動(dòng)報(bào)錯(cuò)Failed?to?start?LSB:start?and?stop?MySQL的問題解決
- MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯(cuò)誤的解決辦法
- MySQL連接拋出Authentication Failed錯(cuò)誤的分析與解決思路
相關(guān)文章
MySQL的match函數(shù)在sp中使用BUG解決分析
這篇文章主要為大家介紹了MySQL的match函數(shù)在sp中使用BUG解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_d
這篇文章主要介紹了解決Mysql建表時(shí)報(bào)錯(cuò)invalid?ON?UPDATE?clause?for?'create_date'?column問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Can''t connect to MySQL server on ''localhost'' (10048)問題解決方
windows 2003服務(wù)器運(yùn)行php的提示Can't connect to MySQL server on 'localhost' (10048), 下面來看下解決方法2013-09-09圖文詳解MySQL中兩表關(guān)聯(lián)的連接表如何創(chuàng)建索引
這篇文章通過圖文給大家介紹了關(guān)于MySQL中兩表關(guān)聯(lián)的連接表如何創(chuàng)建索引的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-05-05MySQL報(bào)錯(cuò)cannot?add?foreign?key?constraint的問題解決方法
這篇文章主要介紹了MySQL報(bào)錯(cuò)cannot?add?foreign?key?constraint的問題解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例
這篇文章主要介紹了MySQL通過觸發(fā)器解決數(shù)據(jù)庫中表的行數(shù)限制詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04mysql動(dòng)態(tài)游標(biāo)學(xué)習(xí)(mysql存儲(chǔ)過程游標(biāo))
mysql動(dòng)態(tài)游標(biāo)示例,通過準(zhǔn)備語句、視圖和靜態(tài)游標(biāo)實(shí)現(xiàn),大家參考使用吧2013-12-12簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢
分析MySQL語句查詢性能的方法除了使用 EXPLAIN 輸出執(zhí)行計(jì)劃,還可以讓MySQL記錄下查詢超過指定時(shí)間的語句,我們將超過指定時(shí)間的SQL語句查詢稱為“慢查詢”2017-01-01使用mysql_udf與curl庫完成http_post通信模塊示例
這篇文章主要介紹了使用mysql_udf與curl庫完成http_post通信模塊示例,需要的朋友可以參考下2014-03-03