767

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

错误 1701 (42000):无法截断在外键约束 ( mytest. instance, CONSTRAINT instance_ibfk_1FOREIGN KEY ( GroupID) REFERENCES mytest. mygroup( 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;
4

14 回答 14

1453

是的你可以:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

使用这些语句,您可能会将不遵守FOREIGN KEY约束的行放入表中。

于 2011-11-10T03:02:02.440 回答
1174

您不能TRUNCATE对应用了 FK 约束的表(TRUNCATE与 不同DELETE)。

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

选项1:

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

选项 2: user447951他们的回答中建议

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
于 2011-03-27T22:03:44.433 回答
211

我会简单地这样做:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
于 2014-09-24T11:05:49.270 回答
30

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

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

在此处输入图像描述

于 2018-11-05T12:29:14.513 回答
23

你可以做

DELETE FROM `mytable` WHERE `id` > 0
于 2017-05-13T13:20:27.470 回答
15

在 MYSQL 数据库上测试

解决方案1:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;

解决方案2:

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

这对我有用。我希望,这也会对你有所帮助。感谢您提出这个问题。

于 2019-11-13T11:37:27.483 回答
14

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

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

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

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

于 2012-10-16T09:20:36.157 回答
8

虽然有人问了这个问题,但我不知道,但现在如果您使用 phpMyAdmin,您只需打开数据库并选择要截断的表即可。

  • 在底部有一个包含许多选项的下拉菜单。打开它并选择Empty标题下的选项Delete data or table
  • 它会自动将您带到下一页,其中复选框中有一个名为 的选项Enable foreign key checks。只需取消选择它并按下Yes按钮,选定的表格将被截断。

也许它在内部运行user447951 的答案中建议的查询,但从 phpMyAdmin 界面使用非常方便。

于 2016-12-22T11:41:54.570 回答
6

答案确实是zerkms提供的答案,如选项 1所述:

选项 1:不会损害数据完整性:

  1. 移除约束
  2. 执行截断
  3. 手动删除现在无处引用的行
  4. 创建约束

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

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

    在此处输入图像描述

  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>);
于 2016-11-24T19:15:15.847 回答
1

只需使用 CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

但准备好级联删除)

于 2019-03-25T12:41:55.817 回答
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;
于 2017-12-15T19:02:25.133 回答
0

如果表的数据库引擎不同,您将收到此错误,因此请将它们更改为 InnoDB

ALTER TABLE my_table ENGINE = InnoDB;
于 2018-08-20T21:14:36.397 回答
0

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

delete from table_name where 1

然后运行:

ALTER TABLE table_name AUTO_INCREMENT = 1
于 2021-06-03T06:02:14.883 回答
0

如何截断外键约束表?此图将演示如何在截断具有外键约束的表时解决 mysql 错误。如果您使用 PHPMYADMIN,很容易截断带有外键约束的表。

  1. 登录到 PHPMYADMIN 并单击要截断的表。
  2. 然后转到 SQL 选项卡将您的代码截断表放在 SQL 编辑器示例中截断表学生;用表的名称替换学生。
  3. 在编辑器底部取消勾选“启用外键检查”复选框,如下所示:

在此处输入图像描述

它会像魔术一样工作。

于 2022-01-18T18:02:24.190 回答