关于 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;
本帖已被设为精华帖!
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
Destiny

:+1: 刚好用到!

6年前 评论

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

5年前 评论

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