关于 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;
本帖已被设为精华帖!
:+1: 刚好用到!
非常感谢,解决卡了我一上午的问题!!