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