为什么mygroup
上的 TRUNCATE 不起作用?
即使我有ON DELETE CASCADE SET
我得到了:
错误1701(42000):无法截断外键约束中引用的表(
mytest
。instance
,CONSTRAINTinstance_ibfk_1
FOREIGN KEY(GroupID
)REFERENCES {{ 1}}。mytest
(mygroup
))
ID
答案 0 :(得分:1201)
是的,你可以:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
使用这些语句,您可能会冒险将行放入不符合FOREIGN KEY
约束条件的表中。
答案 1 :(得分:833)
您不能TRUNCATE
在其上应用了FK约束的表格(TRUNCATE
与DELETE
不同)。
要解决此问题,请使用以下任一解决方案。两者都存在损害数据完整性的风险。
选项1:
TRUNCATE
选项2: user447951 在their answer
中建议SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
答案 2 :(得分:140)
我只会这样做:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
答案 3 :(得分:11)
根据mysql documentation,TRUNCATE不能用于具有外键关系的表。没有完整的替代AFAIK。
删除约束仍然不会调用ON DELETE和ON UPDATE。 我能想到的唯一解决方案是:
在MySQL中似乎TRUNCATE还不是一个完整的功能(它也不会调用触发器)。
见评论
答案 4 :(得分:11)
你可以做到
DELETE FROM `mytable` WHERE `id` > 0
答案 5 :(得分:6)
虽然这个问题是在5年多前被问到的,但我当时并不知道MySql中存在这个功能,但现在如果你使用 phpmyadmin ,你只需打开数据库然后选择要截断的表格。在底部有一个下拉列表,其中列出了许多选项。打开它,然后选择标题删除数据或表格下的清空选项。它会自动转到下一页,其中复选框中有一个选项,称为启用外键检查。只需取消选择它并按是按钮,所选表格将被截断。可以在内部运行user447951的答案中建议的查询。但是从phpmyadmin界面使用它非常方便。
答案 6 :(得分:3)
答案确实为the one provided by zerkms,如选项1 :
所述选项1 :不会有损害数据完整性的风险:
- 删除约束
- 执行TRUNCATE
- 手动删除现在引用无处的行
- 创建约束
醇>
棘手的部分是删除约束,所以我想告诉你如何有人需要知道如何做到这一点:
答案 7 :(得分:3)
答案 8 :(得分:1)
只需使用CASCADE
TRUNCATE "products" RESTART IDENTITY CASCADE;
但是准备好级联删除
答案 9 :(得分:1)
在MYSQL数据库上测试
解决方案1:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
解决方案2:
DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;
这对我有用。希望对您有帮助。感谢您提出这个问题。
答案 10 :(得分:0)
获取旧的外键检查状态和sql模式是在将模型同步到数据库时将Mysql Workbench截断/删除表的最佳方法。
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
答案 11 :(得分:0)
如果表的数据库引擎不同,则会出现此错误,因此请将其更改为InnoDB
ALTER TABLE my_table ENGINE = InnoDB;
答案 12 :(得分:0)
另一种解决方法是删除表中的所有行,然后重置自增列:
delete from table_name where 1
然后运行:
ALTER TABLE table_name AUTO_INCREMENT = 1