wake-up-neo.com

Laravel 5.1 Migration und Seeding Kann eine Tabelle, auf die in einer Fremdschlüsseleinschränkung verwiesen wird, nicht abschneiden

Ich versuche, die Migration auszuführen (siehe unten) und die Datenbank zu säen, aber wenn ich das ausführe

php artisan migrate --seed

Ich erhalte diesen Fehler:

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

Ich habe nachgesehen, was dieser Fehler bedeuten soll, und habe auch Beispiele von anderen Leuten gefunden, die auf das gleiche Problem gestoßen sind, sogar nur im Zusammenhang mit MySQL und ihren Lösungen.

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

Down () scheint nicht zu funktionieren, und wenn ich in MySQL beschreiben, sehen die Tabellen richtig aus.

Die Migrationen werden ordnungsgemäß benannt, um sicherzustellen, dass zuerst die Benutzertabelle migriert wird, und anschließend Fahrzeuge, sodass der Fremdschlüssel angewendet werden kann. Wenn die Tabellen ordnungsgemäß eingerichtet werden, ist dies ein Hinweis darauf, dass die Migrationen ausgeführt wurden. Ich habe die Datenbank gelöscht und neu erstellt und es erneut versucht, und es ist dasselbe Ergebnis. Ich verstehe auch nicht, warum es versucht, die erste Migration und den Start der Datenbank abzuschneiden. Ich hätte nicht gedacht, dass das passieren würde, wenn Sie versuchen, PHP Handwerker-Migration auszuführen: 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

Wie der Fehler besagt, können Sie Tabellen, auf die Fremdschlüssel verweisen, nicht kürzen. Löschen sollte aber funktionieren ...

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

es ist Arbeit!

32
haobird

clear eine table mit Eloquent:

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

Beispiel mit Standardbenutzermodell

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

Sie können dies verwenden, es funktioniert für mich

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

Folgendes funktioniert bei mir jedes Mal ... Wenn Sie den Fremdschlüssel hinzufügen, stellen Sie sicher, dass Sie cascade. Hinzufügen. Die Syntax lautet wie folgt

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

Stellen Sie sicher, dass Sie id durch das für Sie zutreffende Feld ersetzen.

Bevor Sie nun das Seeding ausführen, fügen Sie dies anstelle von trucate ein.

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

Es werden alle Daten gelöscht .. Hoffen Sie, dass dies hilft.

0
Koushik Das

sie können verwenden

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

wenn Sie eine Tabelle leeren, wird die Tabellenstruktur dadurch nicht gelöscht. Die Auto-Inkrement-ID beginnt jedoch nicht bei der ursprünglichen Nummer.

0
Lilian Sun