如何截断外键约束表?

为何mygroup上的TRUNCATE不起做用? 即便我有ON DELETE CASCADE SET我获得: php

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

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。 sql

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

  • 删除全部行,删除外键,截断,从新建立键
  • 删除全部行,重置auto_increment(若是使用)

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


#2楼

我只想这样作: code

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

#3楼

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

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

  1. 删除约束
  2. 执行TRUNCATE
  3. 手动删除如今引用无处的行
  4. 建立约束

棘手的部分是删除约束 ,因此我想告诉你如何,以防有人须要知道如何作到这一点: 文档

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

    在此输入图像描述

  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
相关文章
相关标签/搜索