Skip to content

Instantly share code, notes, and snippets.

Last active March 15, 2024 10:47
Show Gist options
  • Save isimmons/8202227 to your computer and use it in GitHub Desktop.
Save isimmons/8202227 to your computer and use it in GitHub Desktop.
Truncate tables with foreign key constraints in a Laravel seed file.

For the scenario, imagine posts has a foreign key user_id referencing

public function up()
	Schema::create('posts', function(Blueprint $table) {

running seeds with truncate() will trigger a constraint violation if foreign key checks is not disabled.

	Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint ...

The fix:


class DatabaseSeeder extends Seeder {

	 * Run the database seeds.
	 * @return void
	public function run()

		//disable foreign key check for this connection before running seeders
		DB::statement('SET FOREIGN_KEY_CHECKS=0;');

		// supposed to only apply to a single connection and reset it's self
		// but I like to explicitly undo what I've done for clarity
		DB::statement('SET FOREIGN_KEY_CHECKS=1;');


fix from here

As pointed out in the comments at SO you wouldn't want to disable foreign key checks on a production app but you really don't want to run seed files in production either so obviously this is not intended for production but helpful in development.

Copy link

It works for me!

Copy link

thx! works for me too

Copy link

Thx this saved my project

Copy link

@mikedamoiseau thank you!!

Copy link

Thanks for this fix. works on laravel 7

Copy link

pishguy commented May 29, 2020

you can use this code on Laravel 7




Copy link

Hi, I have this problem in MsSQL, and I conclude that I have just 2 options (beside moving away from MSSQL =D)

  1. Remove the foreign key, truncate and recreate the foreign key
  2. Delete table data and reset the Auto increment

I Found the approach 2 much better. Here is the working code:

$tableName = (new Model())->getTable();
\Illuminate\Support\Facades\DB::table($tableName )->delete();
\Illuminate\Support\Facades\DB::statement("DBCC CHECKIDENT ({$tableName }, RESEED, 0)");

Baiscally its what the truncate does (obviously the truncate is much faster), But it work.

Copy link

thanks man, it worked for me!

Copy link


Copy link

This code seems to work too (MySQL, Laravel 5.2.45):


This works for whatever DB you're using.
I'm switching from MySQL to Postgres and this specific were amazing.


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment