如何截断外键约束表?

拜拜、爱过 提交于 2020-01-06 17:03:09

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

ERROR 1701(42000):无法截断外键约束引用的表( mytestinstance ,约束instance_ibfk_1外键( GroupID )参考文献mytestmygroupID ))

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;

#1楼

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

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

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

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


#2楼

我只想这样做:

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

#3楼

答案确实zerkms提供的答案 ,如备选方案1所述

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

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

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

  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>);

#4楼

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


#5楼

你可以做

DELETE FROM `mytable` WHERE `id` > 0
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!