为什么我的团队中没有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;
答案确实是zerkms提供的,如选项1所述:
选项1:不会对数据完整性造成损害:移除约束执行TRUNCATE手动删除现在无处引用的行创建约束
棘手的部分是消除约束,所以我想告诉你,如果有人需要知道如何做到这一点:
运行SHOW CREATE TABLE<TABLE Name>查询以查看FOREIGN KEY的名称(下图中的红色框):运行ALTER TABLE<表名>DROP FOREIGN KEY<外键名>。这将删除外键约束。删除关联的索引(通过表结构页),就完成了。
要重新创建外键:
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
获取旧的外键检查状态和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;
如果您使用的是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();