33

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

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

このエラーが何を意味するのかを調べたところ、MySQLの使用とその解決策に関連しているだけでも、同じ問題に遭遇している他の人々の例が見つかりましたが、適用されます:

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

down() 内では機能していないようで、MySQL で describe を実行すると、テーブルが正しく表示されます。

移行には適切な名前が付けられているため、最初に users テーブルが移行され、次に vehicle が移行されるため、外部キーを適用できます。正しく設定されているテーブルは、移行が実行されたことを示していますが、その後エラーが発生します。DBを削除して再作成し、再試行しましたが、同じ結果です。また、データベースの最初の移行とシードで切り詰めようとしている理由もわかりません。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');
}
4

9 に答える 9

45

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

DB::table('some_table')->delete();
于 2015-07-06T12:43:31.483 に答える