天天看點

mysql删除外鍵限制exists,MySQL删除表時忽略外鍵限制如何實作方法例子分享

MySQL删除表時忽略外鍵限制如何實作方法例子分享給大家,本文是告訴大家關于MySQL删除表的時候忽略外鍵限制的簡單實作,有興趣的朋友趕緊來了解一下吧。

删除表并不常見,特别是對于具有外鍵關聯的表。但是,在開發過程中,通常會發現Schema設計存在問題并删除現有資料庫中的所有表以進行重新建立;此外,在測試時,還有所有需要重新建立資料庫的表。當然,許多自動化工具都可以做這些事情。

删除表時有的時候會遇到這樣的錯誤消息:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

這是因為您試圖删除的表中的字段被用作其他表的外鍵,是以必須首先删除表(子表),然後删除表(父表)。也就是說,删除表的過程需要與建立表的過程相一緻。

然而,這通常是不可接受的。一方面,如果有太多的表,手工排序有點不可接受;此外,沒有自動工具對排序(事實上,這不是不可能的)。是以,MySQL提供了一個變量Fu外KKey檢查以确定是否需要檢查外鍵限制。

通常比較推薦這樣做:

首先,自動生成所有的DROP語句,将其中的MyDatabaseName替換成你的資料庫名稱:

SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')

FROM information_schema.tables

WHERE table_schema = 'MyDatabaseName';

接着,在生成的代碼前後添加下面設定FOREIGN_KEY_CHECKS變量的語句:

SET FOREIGN_KEY_CHECKS = 0

-- DROP語句

SET FOREIGN_KEY_CHECKS = 1;

但是,如果忘記了最後一句也沒有什麼關系,這個變量是基于Session的,也就是說,當你關閉了用戶端,重建立立連接配接時,這個變量會恢複預設值。假如需要在全局範圍内不檢查外鍵限制(這種情況會很少吧),可以這麼做:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

或者

set @@global.FOREIGN_KEY_CHECKS = 0;