如何截斷外鍵約束表?

爲何mygroup上的TRUNCATE不起做用? 即便我有ON DELETE CASCADE SET我獲得: php

ERROR 1701(42000):沒法截斷外鍵約束引用的表( mytestinstance ,約束instance_ibfk_1外鍵( GroupID )參考文獻mytestmygroupID )) mysql

drop database mytest;
create database mytest;
use mytest;

CREATE TABLE mygroup (
   ID    INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE instance (
   ID           INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   GroupID      INT NOT NULL,
   DateTime     DATETIME DEFAULT NULL,

   FOREIGN KEY  (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
   UNIQUE(GroupID)
) ENGINE=InnoDB;

#1樓

根據mysql文檔 ,TRUNCATE不能用於具備外鍵關係的表。 沒有完整的替代AFAIK。 sql

刪除約束仍然不會調用ON DELETE和ON UPDATE。 我能想到的惟一解決方案是: 數據庫

  • 刪除全部行,刪除外鍵,截斷,從新建立鍵
  • 刪除全部行,重置auto_increment(若是使用)

在MySQL中彷佛TRUNCATE還不是一個完整的功能(它也不會調用觸發器)。 見評論 spa


#2樓

我只想這樣作: code

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;

#3樓

答案確實zerkms提供的答案 ,如備選方案1所述索引

選項1 :不會有損壞數據完整性的風險: rem

  1. 刪除約束
  2. 執行TRUNCATE
  3. 手動刪除如今引用無處的行
  4. 建立約束

棘手的部分是刪除約束 ,因此我想告訴你如何,以防有人須要知道如何作到這一點: 文檔

  1. 運行SHOW CREATE TABLE <Table Name>查詢以查看您的FOREIGN KEY的名稱(下圖中的紅框): get

    在此輸入圖像描述

  2. 運行ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> 。 這將刪除外鍵約束。

  3. 刪除關聯的索引 (經過表結構頁面),您就完成了。

從新建立外鍵:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);

#4樓

雖然這個問題是在5年前提出的,但我不知道當時MySql中存在這個功能,但如今若是你使用phpmyadmin,你只需打開數據庫,而後選擇你要截斷的表。 在底部有一個下拉列表,其中列出了許多選項。 打開它並選擇標題刪除數據或表格下的清空選項。 它會自動轉到下一頁,其中複選框中有一個選項,稱爲啓用外鍵檢查。 只需取消選擇它並按是按鈕,所選表格將被截斷。 能夠在內部運行user447951的答案中建議的查詢。 可是從phpmyadmin界面使用很是方便。


#5樓

你能夠作

DELETE FROM `mytable` WHERE `id` > 0
相關文章
相關標籤/搜索