2015-07-02 20 views
10

Sto cercando di eseguire la migrazione (vedi sotto) e seminare il database, ma quando corrolaravel 5.1 Migrazione e semina non può troncare una tabella di riferimento in un vincolo di chiave esterna

php artisan migrate --seed 

ottengo questo errore :

Migration table created successfully. 
Migrated: 2015_06_17_100000_create_users_table 
Migrated: 2015_06_17_200000_create_password_resets_table 
Migrated: 2015_06_17_300000_create_vehicles_table 

[Illuminate\Database\QueryException] 
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table 
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic 
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id` 
)) (SQL: truncate `users`) 

[PDOException] 
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table 
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic 
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id` 
)) 

ho guardato quello che si suppone questo errore significare, e anche trovato examples di altre persone in esecuzione nello stesso problema, anche solo legati all'utilizzo MySQL, e le loro soluzioni, ma si applicano:

DB::statement('SET FOREIGN_KEY_CHECKS=0;'); and 
DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 

All'interno di down() non sembra funzionare e quando corro descrivo in MySQL le tabelle sembrano corrette.

Le migrazioni vengono denominate correttamente per assicurarsi che la tabella degli utenti venga migrata per prime, quindi i veicoli in modo che la chiave esterna possa essere applicata e le tabelle che vengono configurate correttamente suggeriscono che le migrazioni sono state eseguite, ma poi si verifica l'errore. Ho abbandonato e ricreato il DB e l'ho provato di nuovo ed è lo stesso risultato. Inoltre, non capisco perché stia tentando di troncare la prima migrazione e il seed del database, non avrei pensato che si sarebbe verificato quando si è tentato di eseguire la migrazione di php artisan: refresh --seed.

// 2015_06_17_100000_create_users_table.php 

class CreateUsersTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('users', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('username', 60)->unique(); 
      $table->string('email', 200)->unique(); 
      $table->string('password', 255); 
      $table->string('role')->default('user'); 
      $table->rememberToken(); 
      $table->timestamps(); 
     }); 
    } 
} 

public function down() 
{ 
    Schema::drop('users'); 
} 

// 2015_06_17_300000_create_vehicles_table.php 

class CreateVehiclesTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('vehicles', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('user_id')->unsigned(); 
      $table->string('make'); 
      $table->string('model'); 
      $table->string('year'); 
      $table->string('color'); 
      $table->string('plate'); 
      $table->timestamps(); 

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

public function down() 
{ 
    Schema::drop('vehicles'); 
} 
+1

Si sta tentando di avviare il database sulla prima migrazione perché si passa l'opzione '--seed'.Le tue migrazioni vanno bene, è il seeding che è il problema. Puoi aggiungere il codice per la seminatrice da tavolo dei veicoli? – user3158900

+1

Si potrebbe anche voler provare 'delete()' piuttosto che 'truncate()'. Questo dovrebbe funzionare – user3158900

+1

Ciao @ utente3158900, l'ho trovato in DatabaseSeeder. Ho aggiunto aggiunto delete() e funziona. Se pubblichi una risposta, la contrassegnerò come corretta. – mtpultz

risposta

22

Come dice l'errore, non è possibile troncare le tabelle a cui fanno riferimento le chiavi esterne. Eliminare dovrebbe funzionare anche se ...

DB::table('some_table')->delete(); 
20
DB::statement('SET FOREIGN_KEY_CHECKS=0;'); 
App\User::truncate(); 
DB::statement('SET FOREIGN_KEY_CHECKS=1;'); 

è un lavoro

+0

Sfortunatamente questo funziona solo su MySQL. – LePhleg

+1

Saltare il controllo delle chiavi esterne è una pessima pratica. Il troncamento reimposta l'ID autoincrementante, ad esempio, quindi le relazioni saranno errate da questo punto in poi – CommonToast

+0

@CommonToast Sono d'accordo con te, quando parli di dati del mondo reale, che è una cattiva pratica, ma in un progetto greenfield, questo potrebbe aiuto durante la creazione di migrazioni e semi. Come si risolvono i dati orfani, con tutte le restrizioni, se questi potrebbero essersi verificati in un ambiente di schema ampio e multiplo? – Semo

2

Per clear un table utilizzando Eloquent:

Model::query()->delete(); 

Esempio modello di utente che utilizza di default

User::query()->delete(); 
0

Ecco cosa funziona per me ogni volta. Quando aggiungi la chiave esterna, assicurati di aggiungere cascade. la sintassi è come questo

$table->foreign('column')->references('id')->on('table_name')->onDelete('cascade'); 

Assicurarsi di sostituire id con qualsiasi campo è applicabile per voi.

Ora prima di eseguire la semina aggiungere questo invece di trucate

DB::statement('DELETE FROM table_name'); 

cancellerà tutti i dati. Spero che questo aiuti.

0

è possibile utilizzare

DB::table('your_table_name')->delete(); 

per svuotare un tavolo, questo non eliminerà la struttura della tabella. Ma l'ID di incremento automatico non inizierà dal numero iniziale.