MySQL刪除表的時候忽略外鍵約束的程式碼實例分享

黄舟
發布: 2017-03-18 13:57:27
原創
1552 人瀏覽過

下面小編就為大家帶來一篇MySQL刪除表格的時候忽略外鍵限制的簡單實作。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

刪除表不是特別常用,特別是對於存在外鍵關聯的表,刪除更得小心。但是在開發過程中,發現Schema設計的有問題而且要刪除現有的資料庫中所有的表來重新建立也是常有的事情;另外在測試的時候,也有需要重新建立資料庫的所有表。當然很多自動化工具也可以做這樣的事情。

刪除表格的時候有時會遇到這樣的錯誤訊息:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
登入後複製

這是因為你嘗試刪除的表格中的欄位被用作了其他表的外鍵,因此在刪除這個表(父表)之前必須先刪除具有外鍵的表(子表)。也就是說,刪除表的過程需要和建立表的過程一致。

但是這往往不可接受,一方面如果表太多了,手動排序有點不可接受;另一方面,現在還沒有自動的工具對進行排序(其實也不是不能實現)。因此,MySQL中提供了一個變數FOREIGN_KEY_CHECKS來設定是否在必要的時候檢查外鍵約束。

一般比較建議這樣做:

首先,自動產生所有的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;
登入後複製

以上是MySQL刪除表的時候忽略外鍵約束的程式碼實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!