关于 Seeder 的 truncate table 的使用

报错的例子:

 DB::table('users')->truncate();
 SQLSTATE[42000]: Syntax error or access violation:
 1701 Cannot truncate a table referenced in a foreign key constraint 

解决方法(这里的数据库类型是Mysql):

 DB::table('users')->truncate();
 当你seed不进去的时候
 解决方法如下
 DB::statement('SET FOREIGN_KEY_CHECKS = 0');禁用外键约束
 DB::table('users')->truncate();
 DB::statement('SET FOREIGN_KEY_CHECKS = 1');启用外键约束

提醒(这里的数据库类型是Mysql):

 如果你要插入多个truncate table,只要在SET FOREIGN_KEY_CHECKS = 0和1中添加
 DB::statement('SET FOREIGN_KEY_CHECKS = 0');禁用外键约束
 DB::table('users')->truncate();
 DB::table('CelineDion')->truncate();
 DB::table('ToniBraxton')->truncate();
 DB::statement('SET FOREIGN_KEY_CHECKS = 1');启用外键约束

好处:

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。
但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

附言:

 不同的数据库类型禁用与启用外键约束的"语法"也不同;

其他数据库类型的语法(我所知道的,其他的必应一下吧!):

MSSQL
-- Disable checks:
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";
-- Enable checks:
EXEC sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all";
MySQL:
-- Disable checks:
SET FOREIGN_KEY_CHECKS = 0;
-- Enable checks:
SET FOREIGN_KEY_CHECKS = 1;
SQLite:
-- Disable checks:
PRAGMA foreign_keys = OFF;
-- Enable checks:
PRAGMA foreign_keys = ON;
4D:
-- Disable checks:
ALTER DATABASE DISABLE CONSTRAINTS;
-- Enable checks:
ALTER DATABASE ENABLE CONSTRAINTS;
本帖已被设为精华帖!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
Destiny

:+1: 刚好用到!

6年前 评论

非常感谢,解决卡了我一上午的问题!!

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!