mygroup
上的 TRUNCATE 为什么不起作用?即使我有 ON DELETE CASCADE SET
我得到:
ERROR 1701(42000):无法截断外键约束中引用的表(mytest.instance,CONSTRAINT instance_ibfk_1 FOREIGN 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;
10 回答
我只想这样做:
虽然这个问题是在5年前提出的,但我不知道当时MySql中存在此工具,但现在如果使用 phpmyadmin ,您只需打开数据库,然后选择要截断的表 . 在底部有一个下拉列表,其中列出了许多选项 . 打开它并在 Headers Delete data or table 下选择 Empty 选项 . 它会自动转到下一页,其中复选框中有一个选项,称为启用外键检查 . 只需取消选择它并按是按钮,所选表格将被截断 . 可以在内部运行user447951的答案中建议的查询 . 但是从phpmyadmin界面使用非常方便 .
如果表的数据库引擎不同,您将收到此错误,因此将它们更改为InnoDB
根据mysql documentation,TRUNCATE不能用于具有外键关系的表 . 没有完整的替代AFAIK .
删除约束仍然不会调用ON DELETE和ON UPDATE . 我能想到的唯一解决方案是:
删除所有行,删除外键,截断,重新创建键
删除所有行,重置auto_increment(如果使用)
在MySQL中似乎TRUNCATE还不是一个完整的功能(它也不会调用触发器) . 见评论
你可以做
获取旧的外键检查状态和sql模式是在将模型同步到数据库时将Mysql Workbench截断/删除表的最佳方法 .
是的你可以:
使用这些语句,您可能会冒险将行放入不符合
FOREIGN KEY
约束的表中 .答案确实是the one provided by zerkms,如 Option 1 所述:
棘手的部分是 Removing constraints ,所以我想告诉你如何,以防有人需要知道如何做到这一点:
SHOW CREATE TABLE <Table Name>
查询以查看 FOREIGN KEY 的名称是什么(下图中的红框):运行
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. 这将删除外键约束 .删除关联的 Index (通过表结构页面),您就完成了 .
重新创建外键:
如果你使用phpMyAdmin很容易 .
只需取消选中
SQL
标签下的Enable foreign key checks
选项并运行TRUNCATE <TABLE_NAME>
您不能
TRUNCATE
上应用了FK约束的表(TRUNCATE
与DELETE
不同) .要解决此问题,请使用以下任一解决方案 . 两者都存在损害数据完整性的风险 .
Option 1:
删除约束
执行
TRUNCATE
手动删除现在引用 nowhere 的行
创建约束
Option 2: 由 user447951 建议their answer