截断外键约束表

为什么我的群组上没有TRUNCATE ? 即使我有ON DELETE CASCADE SET我得到:

错误1701(42000):无法截断在外键约束中引用的表( mytest ,CONSTRAINT instance_ibfk_1 FOREIGN KEY( GroupID )REFERENCES mygroupID ))

 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约束的表( TRUNCATEDELETE )。

要解决此问题,请使用这些解决scheme之一。 两者都存在破坏数据完整性的风险。

选项1:

  1. 删除约束
  2. 执行TRUNCATE
  3. 手动删除现在引用无处的行
  4. 创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 :不会损害数据完整性:

  1. 删除约束
  2. 执行TRUNCATE
  3. 手动删除现在引用无处的行
  4. 创build约束

棘手的部分是删除约束 ,所以我想告诉你如何有人需要知道如何做到这一点:

  1. 运行SHOW CREATE TABLE <Table Name>查询,看看你的FOREIGN KEY的名字是什么(下图中的红框):

    在这里输入图像描述

  2. 运行ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> 。 这将删除外键约束。

  3. 删除关联的索引 (通过表结构页面),就完成了。