协慌网

登录 贡献 社区

如何截断外键约束表?

为什么mygroup的 TRUNCATE不起作用?即使我有ON DELETE CASCADE SET我也会得到:

ERROR 1701(42000):无法截断外键约束引用的表( mytestinstance ,约束instance_ibfk_1外键( GroupID )参考mytestmygroupID ))

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:

  1. 消除约束
  2. 执行TRUNCATE
  3. 手动删除现在已无处引用的行
  4. 创建约束

选项 2:user447951其答案中建议

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;