爲何mygroup
上的TRUNCATE不起做用? 即便我有ON DELETE CASCADE SET
我獲得: php
ERROR 1701(42000):沒法截斷外鍵約束引用的表(
mytest
。instance
,約束instance_ibfk_1
外鍵(GroupID
)參考文獻mytest
。mygroup
(ID
)) 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;
根據mysql文檔 ,TRUNCATE不能用於具備外鍵關係的表。 沒有完整的替代AFAIK。 sql
刪除約束仍然不會調用ON DELETE和ON UPDATE。 我能想到的惟一解決方案是: 數據庫
在MySQL中彷佛TRUNCATE還不是一個完整的功能(它也不會調用觸發器)。
見評論 spa
我只想這樣作: code
DELETE FROM mytest.instance; ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
答案確實是zerkms提供的答案 ,如備選方案1所述 : 索引
選項1 :不會有損壞數據完整性的風險: rem
- 刪除約束
- 執行TRUNCATE
- 手動刪除如今引用無處的行
- 建立約束
棘手的部分是刪除約束 ,因此我想告訴你如何,以防有人須要知道如何作到這一點: 文檔
運行SHOW CREATE TABLE <Table Name>
查詢以查看您的FOREIGN KEY的名稱(下圖中的紅框): get
運行ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
。 這將刪除外鍵約束。
刪除關聯的索引 (經過表結構頁面),您就完成了。
從新建立外鍵:
ALTER TABLE <Table Name> ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
雖然這個問題是在5年前提出的,但我不知道當時MySql中存在這個功能,但如今若是你使用phpmyadmin,你只需打開數據庫,而後選擇你要截斷的表。 在底部有一個下拉列表,其中列出了許多選項。 打開它並選擇標題刪除數據或表格下的清空選項。 它會自動轉到下一頁,其中複選框中有一個選項,稱爲啓用外鍵檢查。 只需取消選擇它並按是按鈕,所選表格將被截斷。 能夠在內部運行user447951的答案中建議的查詢。 可是從phpmyadmin界面使用很是方便。
你能夠作
DELETE FROM `mytable` WHERE `id` > 0