如何截断外键约束表?

问题描述 投票:558回答:11

为什么Qazxswpoi上的TRUNCATE不起作用?即使我有mygroup我得到:

ERROR 1701(42000):无法截断外键约束中引用的表(ON DELETE CASCADE SET.mytest,CONSTRAINT instance FOREIGN KEY(instance_ibfk_1)REFERENCES GroupID.mytestmygroup))

ID
mysql foreign-keys constraints truncate dml
11个回答
860
投票

你不能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; 一个表上有FK约束的表(TRUNCATETRUNCATE不同)。

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

选项1:

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

选项2:由TRUNCATE中的user447951建议

their answer

0
投票

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

TRUNCATE "products" RESTART IDENTITY CASCADE;

0
投票

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

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;

1227
投票

是的你可以:

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; 约束的表中。


142
投票

我只想这样做:

FOREIGN KEY

12
投票

你可以做

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

11
投票

根据DELETE FROM `mytable` WHERE `id` > 0 ,TRUNCATE不能用于具有外键关系的表。没有完整的替代AFAIK。

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

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

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


6
投票

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


4
投票

答案确实是mysql documentation,如备选方案1所述:

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

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

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

  1. 运行the one provided by zerkms查询以查看您的FOREIGN KEY的名称是什么(下图中的红框): SHOW CREATE TABLE <Table Name>
  2. 运行enter image description here。这将删除外键约束。
  3. 删除关联的索引(通过表结构页面),您就完成了。

重新创建外键:

ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>

4
投票

如果你使用phpMyAdmin很容易。

只需取消选中ALTER TABLE <Table Name> ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>); 选项卡下的Enable foreign key checks选项并运行SQL

TRUNCATE <TABLE_NAME>


2
投票

只需使用CASCADE

enter image description here

但准备好级联删除)

© www.soinside.com 2019 - 2024. All rights reserved.