为什么我的团队中没有TRUNCATE?即使我有一个删除级联集,我得到:

错误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;

当前回答

不能TRUNCATE应用了FK约束的表(TRUNCATE与DELETE不同)。

要解决此问题,请使用以下任一解决方案。两者都存在破坏数据完整性的风险。

选项1:

移除约束执行TRUNCATE手动删除现在无处引用的行创建约束

选项2:由用户447951在回答中建议

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;

其他回答

如果您使用的是laravel迁移,可以使用facade助手来实现

更喜欢使用雄辩的对象,回答“雄辩”的方式

 Schema::disableForeignKeyConstraints();
 Teacher::truncate();
 Schema::enableForeignKeyConstraints();

在Laravel 7和8中,为了兼容4个数据库(MySql、Postgres、SQLite和SqlServer),并且没有Elquent,您可以使用:

Schema::disableForeignKeyConstraints();
    DB::table('teachers')->truncate();
Schema::enableForeignKeyConstraints();

另一种解决方法是删除表中的所有行,然后重置自动递增列:

delete from table_name where 1

然后运行:

ALTER TABLE table_name AUTO_INCREMENT = 1

如果您使用的是phpMyAdmin,那么很简单。

只需取消选中SQL选项卡下的启用外键检查选项,然后运行TRUNCATE<TABLE_NAME>

只需使用CASCADE

TRUNCATE "products" RESTART IDENTITY CASCADE;

但要做好级联删除的准备)

不能TRUNCATE应用了FK约束的表(TRUNCATE与DELETE不同)。

要解决此问题,请使用以下任一解决方案。两者都存在破坏数据完整性的风险。

选项1:

移除约束执行TRUNCATE手动删除现在无处引用的行创建约束

选项2:由用户447951在回答中建议

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;