2

プロジェクトで複数の移行を作成した後、ロールバックしていくつかのことを更新したかったのですが、projectsテーブルを削除しようとすると突然このエラーが発生しました。外部キー制約を再確認しましたが、エラーが見つかりません。

[Illuminate\Database\QueryException]                                         
  SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or upda  
  te a parent row: a foreign key constraint fails (SQL: drop table `projects`  
  )                                                                                                                                                           
  [PDOException]                                                               
  SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or upda  
  te a parent row: a foreign key constraint fails  

ここに私の移行があります: 1.テーブルユーザーを作成します:

public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email', 50)->unique();
            $table->string('password', 60);
            $table->string('password_temp', 60);
            $table->string('code', 60);
            $table->boolean('active');
            $table->string('remember_token', 100);
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('users');
    }

2. クライアント テーブルを作成します。

public function up()
    {
        Schema::create('clients', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('user_id')->unsigned()->index()->nullable();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('clients');
    }

3. プロジェクト テーブルを作成します。

public function up()
    {
        Schema::create('projects', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->integer('status');
            $table->integer('client_id')->unsigned()->index()->nullable();
            $table->foreign('client_id')->references('id')->on('users')->onDelete('cascade');    
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('projects');
    }

前回の移行で、私がしている間違いは何でしょうか?! 移行時には問題はありませんが、ロールバックして変更を追加したときにのみ表示されます。

なぜこれが起こるのか分かりますか?

4

4 に答える 4

4

これを down 関数で使用します。

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::dropIfExists('tableName');
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
于 2015-04-19T15:42:57.097 に答える
3

テーブルで外部キーを使用する場合、テーブルを削除する前に dropForeign メソッドを使用してそれらを削除する必要があります。そうしないと、現在発生している整合性制約の問題が発生します。

public function down()
{
    Schema::table('projects', function(Blueprint $table) {
        $table->dropForeign('projects_client_id_foreign');
    });

    Schema::drop('projects');
}
于 2015-04-19T17:16:53.263 に答える
3

上記のテーブルが 3 つしかない場合は、自分で試してみたので、移行に問題はありません。

php artisan migrate

テーブルを作成し、

php artisan migrate:rollback

ロールバックします。

私が知っていることの1つは、Laravelが移行ファイルのタイムスタンプに基づいて移行のシーケンスを想定することです。

projectsしたがって、エラーメッセージが (SQL: drop table projects)であるため、ドロップされていないテーブルへの外部キー参照を持つ別のテーブルがあると確信しています。

php artisan tinker使用してみて、テーブルを参照しているテーブルはSchema::drop('some_table_name');どこにあるのか、もう一度テーブルを削除してください。some_table_nameprojectsprojects

于 2015-02-27T14:49:00.217 に答える
2

この問題は通常、既存の移行を編集/追加することによって発生します。外部キーを扱うときに新しい移行ファイルを作成するか、潜在的にデータベース全体をダンプ/ドロップして更新する準備をしてください。

于 2015-07-16T05:51:23.403 に答える