报错的例子:
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;