Mysql

是否可以使用 FK 強制刪除 mysql 表?

  • September 4, 2018

為了刪除一個Foreign Key在其他表中使用a的表,需要刪除所有FK與相應表有連接的其他表。

有沒有一種簡單的方法來刪除一個表,以及它的所有子表(它們必須FK在父表中)?

例如,

CREATE TABLE test
(
id int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
) ENGINE=InnoDB

並且 id 是FK5 個子表中的一個。是否可以刪除 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;

試一試 !!!

引用自:https://dba.stackexchange.com/questions/43053