如何截断外键约束表?

时间:2011-03-27 21:57:43

标签: mysql foreign-keys constraints truncate dml

为什么mygroup上的 TRUNCATE 不起作用? 即使我有ON DELETE CASCADE SET我得到了:

  

错误1701(42000):无法截断外键约束中引用的表(mytestinstance,CONSTRAINT instance_ibfk_1 FOREIGN KEY(GroupID)REFERENCES {{ 1}}。mytestmygroup))

ID

13 个答案:

答案 0 :(得分:1201)

是的,你可以:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

使用这些语句,您可能会冒险将行放入不符合FOREIGN KEY约束条件的表中。

答案 1 :(得分:833)

您不能TRUNCATE在其上应用了FK约束的表格(TRUNCATEDELETE不同)。

要解决此问题,请使用以下任一解决方案。两者都存在损害数据完整性的风险。

选项1:

  1. 删除约束
  2. 执行TRUNCATE
  3. 手动删除现在引用无处
  4. 的行
  5. 创建约束
  6. 选项2: user447951 their answer

    中建议
    SET FOREIGN_KEY_CHECKS = 0; 
    TRUNCATE table $table_name; 
    SET FOREIGN_KEY_CHECKS = 1;
    

答案 2 :(得分:140)

我只会这样做:

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

答案 3 :(得分:11)

根据mysql documentation,TRUNCATE不能用于具有外键关系的表。没有完整的替代AFAIK。

删除约束仍然不会调用ON DELETE和ON UPDATE。 我能想到的唯一解决方案是:

  • 删除所有行,删除外键,截断,重新创建键
  • 删除所有行,重置auto_increment(如果使用)

在MySQL中似乎TRUNCATE还不是一个完整的功能(它也不会调用触发器)。 见评论

答案 4 :(得分:11)

你可以做到

DELETE FROM `mytable` WHERE `id` > 0

答案 5 :(得分:6)

虽然这个问题是在5年多前被问到的,但我当时并不知道MySql中存在这个功能,但现在如果你使用 phpmyadmin ,你只需打开数据库然后选择要截断的表格。在底部有一个下拉列表,其中列出了许多选项。打开它,然后选择标题删除数据或表格下的清空选项。它会自动转到下一页,其中复选框中有一个选项,称为启用外键检查。只需取消选择它并按是按钮,所选表格将被截断。可以在内部运行user447951的答案中建议的查询。但是从phpmyadmin界面使用它非常方便。

答案 6 :(得分:3)

答案确实为the one provided by zerkms,如选项1

所述
  

选项1 :不会有损害数据完整性的风险:

     
      
  1. 删除约束
  2.   
  3. 执行TRUNCATE
  4.   
  5. 手动删除现在引用无处的行
  6.   
  7. 创建约束
  8.   

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

  1. 运行SHOW CREATE TABLE <Table Name>查询以查看 FOREIGN KEY 的名称(下图中的红框):

    enter image description here

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

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

  4. 重新创建外键:

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

答案 7 :(得分:3)

如果您使用的是phpMyAdmin,则很容易。

只需取消选中Enable foreign key checks标签下的SQL选项并运行TRUNCATE <TABLE_NAME>

enter image description here

答案 8 :(得分:1)

只需使用CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

但是准备好级联删除

答案 9 :(得分:1)

在MYSQL数据库上测试

解决方案1:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;

解决方案2:

DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;

这对我有用。希望对您有帮助。感谢您提出这个问题。

答案 10 :(得分:0)

获取旧的外键检查状态和sql模式是在将模型同步到数据库时将Mysql Workbench截断/删除表的最佳方法。

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

答案 11 :(得分:0)

如果表的数据库引擎不同,则会出现此错误,因此请将其更改为InnoDB

ALTER TABLE my_table ENGINE = InnoDB;

答案 12 :(得分:0)

另一种解决方法是删除表中的所有行,然后重置自增列:

delete from table_name where 1

然后运行:

ALTER TABLE table_name AUTO_INCREMENT = 1