截断外键约束表
为什么我的群组上没有TRUNCATE ? 即使我有ON DELETE CASCADE SET
我得到:
错误1701(42000):无法截断在外键约束中引用的表(
mytest
,CONSTRAINTinstance_ibfk_1
FOREIGN KEY(GroupID
)REFERENCESmygroup
(ID
))
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;
您不能TRUNCATE
了FK约束的表( TRUNCATE
与DELETE
)。
要解决此问题,请使用这些解决scheme之一。 两者都存在破坏数据完整性的风险。
选项1:
- 删除约束
- 执行
TRUNCATE
- 手动删除现在引用无处的行
- 创build约束
选项2: 由user447951在他们的答案中build议
SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table $table_name; SET FOREIGN_KEY_CHECKS = 1;
是的你可以:
SET FOREIGN_KEY_CHECKS = 0; TRUNCATE table1; TRUNCATE table2; SET FOREIGN_KEY_CHECKS = 1;
使用这些语句,您可能会冒险让行进入不符合FOREIGN KEY
约束的表中。
我会简单地做到这一点:
DELETE FROM mytest.instance; ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
根据mysql文档 ,TRUNCATE不能用于具有外键关系的表。 没有完整的替代AFAIK。
删除这个约束仍然不会调用ON DELETE和ON UPDATE。 我能想到ATM的唯一解决scheme是:
- 删除所有行,删除外键,截断,重新创build键
- 删除所有行,重置auto_increment(如果使用)
在MySQL中似乎TRUNCATE并不是一个完整的function(它也不会调用触发器)。 见评论
你可以做
DELETE FROM `mytable` WHERE `id` > 0
虽然这个问题是在5年前问过的,我不知道这个工具是否存在于MySql中,但是现在如果你使用phpmyadmin,你可以简单地打开数据库,然后select你想要截断的表格。 最下面列出了很多选项。 打开它并在标题删除数据或表格下select清空选项。 在checkbox称为启用外键检查的情况下,它会自动将您带到下一页。 只需取消select,然后按是button,选定的表将被截断。 可能是它在内部运行user447951的答案中build议的查询。 但从phpmyadmin界面使用非常方便。
答案确实是由zerkms提供的答案 ,如选项1所述 :
选项1 :不会损害数据完整性:
- 删除约束
- 执行TRUNCATE
- 手动删除现在引用无处的行
- 创build约束
棘手的部分是删除约束 ,所以我想告诉你如何有人需要知道如何做到这一点:
-
运行
SHOW CREATE TABLE <Table Name>
查询,看看你的FOREIGN KEY的名字是什么(下图中的红框): -
运行
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
。 这将删除外键约束。 -
删除关联的索引 (通过表结构页面),就完成了。