Mysql
是否可以使用 FK 強制刪除 mysql 表?
為了刪除一個
Foreign Key
在其他表中使用a的表,需要刪除所有FK
與相應表有連接的其他表。有沒有一種簡單的方法來刪除一個表,以及它的所有子表(它們必須
FK
在父表中)?例如,
CREATE TABLE test ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id) ) ENGINE=InnoDB
並且 id 是
FK
5 個子表中的一個。是否可以刪除 TABLEtest
並強制刪除所有 5 個子表id
FK
?而不是一一刪除子表?
雖然
ON DELETE CASCADE
可以嘗試,但值得注意的是 mysqldump 的輸出是什麼樣的。在每個 mysqldump 的頂部,您將看到禁用外鍵檢查和唯一鍵檢查的指令:-- MySQL dump 10.13 Distrib 5.5.12, for Win64 (x86) -- -- Host: localhost Database: sample -- ------------------------------------------------------ -- Server version 5.5.12-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
執行 mysqldump 的重新載入使 DB Session 有機會禁用這些檢查,載入表,然後再次啟用檢查。鑑於此,您應該使用這兩個指令手動截斷所有有問題的表。
假設您在, , , ,中有
test
帶有外鍵引用的表t1``t2``t3``t4``t5
只需按以下順序從子表開始截斷:
SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; TRUNCATE TABLE t5; TRUNCATE TABLE t4; TRUNCATE TABLE t3; TRUNCATE TABLE t2; TRUNCATE TABLE t1; TRUNCATE TABLE test; SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1;
更新 2018-07-05 09:33 EDT
我從來沒有回到這個問題來查看OP的澄清,所以讓我完成這個答案。我應該在 5 年前發布的是以下內容:
SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0; DROP TABLE t5; DROP TABLE t4; DROP TABLE t3; DROP TABLE t2; DROP TABLE t1; DROP TABLE test; SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1;
試一試 !!!