web-dev-qa-db-fra.com

Laravel 5.1 Migration et amorçage ne peuvent pas tronquer une table référencée dans une contrainte de clé étrangère

J'essaie de lancer la migration (voir ci-dessous) et d'amorcer la base de données, mais quand je lance

php artisan migrate --seed

Je reçois cette erreur:

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`
))

J'ai cherché ce que cette erreur est supposée vouloir dire et ai également trouvé exemples d'autres personnes rencontrant le même problème, même juste liées à l'utilisation de MySQL , et à leurs solutions, mais en appliquant:

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

Dans down () ne semble pas fonctionner et lorsque je lance une description dans MySQL, les tables sont correctes.

Les migrations sont nommées correctement pour s'assurer que la table users est migrée en premier, puis les véhicules pour que la clé étrangère puisse être appliquée, et les tables en cours de configuration correctement suggèrent que les migrations ont été exécutées, mais ensuite l'erreur se produit. J'ai supprimé et recréé la base de données et l'ai réessayé. Le résultat est identique. Je ne comprends pas non plus pourquoi il essaie de tronquer la première migration et la première graine de la base de données. Je n'aurais pas pensé que cela se produirait si vous tentiez d'exécuter php artisan migrate: 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');
}
14
mtpultz

Comme le dit l'erreur, vous ne pouvez pas tronquer les tables référencées par des clés étrangères. Supprimer devrait fonctionner si ...

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

c'est du travail!

32
haobird

Pour clear une table en utilisant Eloquent:

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

Exemple utilisant le modèle d'utilisateur par défaut

User::query()->delete();
2
Rob

Vous pouvez utiliser ça marche pour moi

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
App\User::truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
2
Umar Tariq

Voici ce qui fonctionne pour moi à chaque fois . Lorsque vous ajoutez la clé étrangère, veillez à ajouter cascade. La syntaxe est la suivante:

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

Assurez-vous de remplacer id par le champ qui vous convient.

Maintenant, avant d'exécuter l'ensemencement, ajoutez ceci au lieu de trucate

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

Il supprimera toutes les données . J'espère que cela vous aidera.

0
Koushik Das

vous pouvez utiliser

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

pour vider une table, cela ne supprimera pas la structure de la table. Mais l'identifiant d'incrémentation automatique ne commencera pas à partir du numéro initial.

0
Lilian Sun