【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
为什么mygroup
上的TRUNCATE不起作用? 即使我有ON DELETE CASCADE SET
我得到:
ERROR 1701(42000):无法截断外键约束引用的表(
mytest
。instance
,约束instance_ibfk_1
外键(GroupID
)参考文献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;
#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 :不会有损坏数据完整性的风险:
- 删除约束
- 执行TRUNCATE
- 手动删除现在引用无处的行
- 创建约束
棘手的部分是删除约束 ,所以我想告诉你如何,以防有人需要知道如何做到这一点:
运行
SHOW CREATE TABLE <Table Name>
查询以查看您的FOREIGN KEY的名称(下图中的红框):运行
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
。 这将删除外键约束。删除关联的索引 (通过表结构页面),您就完成了。
重新创建外键:
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
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3153684