为何mygroup
上的TRUNCATE不起做用? 即便我有ON DELETE CASCADE SET
我获得: php
ERROR 1701(42000):没法截断外键约束引用的表(
mytest
。instance
,约束instance_ibfk_1
外键(GroupID
)参考文献mytest
。mygroup
(ID
)) 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;
根据mysql文档 ,TRUNCATE不能用于具备外键关系的表。 没有完整的替代AFAIK。 sql
删除约束仍然不会调用ON DELETE和ON UPDATE。 我能想到的惟一解决方案是: 数据库
在MySQL中彷佛TRUNCATE还不是一个完整的功能(它也不会调用触发器)。
见评论 spa
我只想这样作: code
DELETE FROM mytest.instance; ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
答案确实是zerkms提供的答案 ,如备选方案1所述 : 索引
选项1 :不会有损坏数据完整性的风险: rem
- 删除约束
- 执行TRUNCATE
- 手动删除如今引用无处的行
- 建立约束
棘手的部分是删除约束 ,因此我想告诉你如何,以防有人须要知道如何作到这一点: 文档
运行SHOW CREATE TABLE <Table Name>
查询以查看您的FOREIGN KEY的名称(下图中的红框): get
运行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>);
虽然这个问题是在5年前提出的,但我不知道当时MySql中存在这个功能,但如今若是你使用phpmyadmin,你只需打开数据库,而后选择你要截断的表。 在底部有一个下拉列表,其中列出了许多选项。 打开它并选择标题删除数据或表格下的清空选项。 它会自动转到下一页,其中复选框中有一个选项,称为启用外键检查。 只需取消选择它并按是按钮,所选表格将被截断。 能够在内部运行user447951的答案中建议的查询。 可是从phpmyadmin界面使用很是方便。
你能够作
DELETE FROM `mytable` WHERE `id` > 0