web-dev-qa-db-ja.com

Laravel 5.1移行とシード外部キー制約で参照されているテーブルを切り捨てることはできません

移行を実行して(以下を参照)データベースをシードしようとしていますが、実行すると

php artisan migrate --seed

私はこのエラーを受け取ります:

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

このエラーの意味を調べ、同じ問題に直面している他の人の examples を見つけました。これは MySQL の使用に関連している場合でも、その解決策ですが、申請中:

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

Down()内では機能しないようで、MySQLでdescribeを実行すると、テーブルは正しく見えます。

移行には適切な名前が付けられ、ユーザーテーブルが最初に移行され、次に外部キーを適用できるように車両が移行され、セットアップ中のテーブルで移行が実行されたことが正しく示されますが、エラーが発生します。 DBを削除して再作成し、再試行しましたが、同じ結果です。また、データベースの最初の移行とシードで切り捨てを試みる理由もわかりません。phpartisan 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');
}
19
mtpultz

エラーが言うように、外部キーによって参照されるテーブルを切り捨てることはできません。削除しても動作するはずです...

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

そしてそれは動作します!

38
haobird

clearを使用してtable a Eloquentへ:

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

デフォルトのユーザーモデルを使用した例

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

あなたはこれを使用することができます

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

これが毎回私にとってうまくいくものです。外部キーを追加するときは、必ずcascadeを追加してください。構文はこのようなものです

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

idを適切なフィールドに置き換えてください。

シードを実行する前に、trucateの代わりにこれを追加してください

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

すべてのデータが削除されます。お役に立てれば。

0
Koushik Das

使用できます

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

テーブルを空にすると、テーブル構造は削除されません。ただし、自動インクリメントIDは初期番号から始まりません。

0
Lilian Sun