为什么 mygroup
上的 TRUNCATE 不起作用?即使我有 ON DELETE CASCADE SET
我得到:
错误 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;
是的你可以:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
使用这些语句,您可能会将不遵守 FOREIGN KEY
约束的行放入表中。
您不能TRUNCATE
应用了 FK 约束的表(TRUNCATE
与 DELETE
不同)。
要解决此问题,请使用这些解决方案之一。两者都存在破坏数据完整性的风险。
选项1:
删除约束 执行 TRUNCATE 手动删除现在无处引用的行 创建约束
选项 2: 由 user447951 在 their answer 中建议
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
我会简单地这样做:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
DELETE
的执行速度比 TRUNCATE
慢。但是由于这个动作通常很少执行,所以这无关紧要。
DELETE
可能绝对是残酷的 - 因为它会命中日志,而 TRUNCATE
只是将数据撕掉。真的取决于用例。
error 1175: You are using safe update mode,...
将删除子句更改为 DELETE FROM mydb.mytable where id != 0
使其完美。
如果您使用的是 phpMyAdmin,这很容易。
只需取消选中 SQL
选项卡下的 Enable foreign key checks
选项并运行 TRUNCATE <TABLE_NAME>
https://i.stack.imgur.com/eKvIg.jpg
你可以做
DELETE FROM `mytable` WHERE `id` > 0
mytable
中删除
flush privileges
。见这里:stackoverflow.com/questions/4767055/…
在 MYSQL 数据库上测试
解决方案1:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
解决方案2:
DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;
这对我有用。我希望,这也会对你有所帮助。感谢您提出这个问题。
根据 mysql documentation,TRUNCATE 不能用于具有外键关系的表。没有完整的替代AFAIK。
删除约束仍然不会调用 ON DELETE 和 ON UPDATE。我能 ATM 想到的唯一解决方案是:
删除所有行,删除外键,截断,重新创建键
删除所有行,重置 auto_increment(如果使用)
MySQL 中的 TRUNCATE 似乎还不是一个完整的功能(它也不会调用触发器)。见评论
TRUNCATE
不完整的观点的注释 - 截断不应该调用触发器等。如果确实如此,它将与 DELETE
相同!它与行无关,因此无法执行与行相关的操作(如调用触发器或检查外键)。它在 Oracle 和 Sql Server 中的工作方式相同。
虽然有人问了这个问题,但我不知道,但现在如果您使用 phpMyAdmin,您只需打开数据库并选择要截断的表即可。
在底部有一个包含许多选项的下拉菜单。打开它并在标题删除数据或表下选择空选项。
它会自动将您带到下一页,其中复选框中有一个名为“启用外键检查”的选项。只需取消选择它并按是按钮,所选表将被截断。
也许它在内部运行 user447951's answer 中建议的查询,但从 phpMyAdmin 界面使用非常方便。
答案确实是 the one provided by zerkms,如 选项 1 所述:
选项 1:不会有损害数据完整性的风险:删除约束执行 TRUNCATE 手动删除现在对无处引用的行 创建约束
棘手的部分是消除约束,所以我想告诉你如何,以防有人需要知道如何做到这一点:
运行 SHOW CREATE TABLE
;
分隔)。这是因为每个新的 Web SQL 调用都会将FOREIGN_KEY_CHECKS
重置为 1。