Omid Reza Heidari
Omid Reza Heidari

Reputation: 688

Can't Truncate Table Befor Seeding

I want to truncate my user table befor seed.i do like this :

DatabaseSeeder.php :

 <?php

 use Illuminate\Database\Seeder;
 use Illuminate\Support\Facades\DB;

 class DatabaseSeeder extends Seeder
 {
     public function run()
     {
         App\User::truncate();

         factory(App\User::class,1)->create();
     }
 }

Then run php artisan db:seed and have error:

In Connection.php line 664:

  SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constra
  int (`mr_musicer`.`dislikes`, CONSTRAINT `dislikes_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `mr_musicer`
  .`users` (`id`)) (SQL: truncate `users`)


In Connection.php line 458:

  SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constra
  int (`mr_musicer`.`dislikes`, CONSTRAINT `dislikes_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `mr_musicer`
  .`users` (`id`))

I want to now why i can't truncate my user table!

Upvotes: 9

Views: 12986

Answers (4)

Hadayat Niazi
Hadayat Niazi

Reputation: 2480

The simplest way to truncate the data before seeding when you have foreign keys in the table

Just add this single line at the start of your run method.

Schema::disableForeignKeyConstraints();

DB::truncate('posts'); or Post::truncate();

Schema::enableForeignKeyConstraints();

Upvotes: 1

Mahsa
Mahsa

Reputation: 742

Import DB:

use Illuminate\Support\Facades\DB;

And then use this piece of code to truncate the table:

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
DB::table('posts')->truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

Upvotes: 3

Malkhazi Dartsmelidze
Malkhazi Dartsmelidze

Reputation: 4992

There is foreign key problem and table is trying to remind it to you. If you want to truncate table anyway.

    Schema::disableForeignKeyConstraints();

    // ... Some Truncate Query

    Schema::enableForeignKeyConstraints();

Don't forget To Use: use Illuminate\Support\Facades\Schema;

Upvotes: 13

Ap Koponen
Ap Koponen

Reputation: 475

You have references to your users on some other table. You should add ->onDelete('cascade') to the dislikes table column that references user's id or delete all dislikes manually first.

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

Upvotes: 0

Related Questions