2013-06-14 7 views
32

私の移行をロールバックしようとしています。外部キーを使用してテーブルを削除するための移行の使用

マイ移行ファイルがマイダウン()関数はそう

public function down() 
{ 
    Schema::drop('pm_convo'); 
    Schema::drop('pm_convo_replys'); 
} 

私は私のmigrateコマンド

php artisan migrate:refresh --seed --env=local 

を実行すると、私は取得していますのようなものですので、

$table->foreign('user_one')->references('id')->on('users'); 
$table->foreign('user_two')->references('id')->on('users'); 

のような外部キーを使用しています次のエラー

SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table `pm_convo`) 

これを修正するために何をすべきか正確にはわかりません。

編集:

私が試してみました:$table->dropForeign('pm_convo_user_one_foreign');

しかし、イムは、それとエラーが出るだけでなく

+0

あなたは外部キー参照のことがあり、別のテーブルを持っていますか'pm_convo'? –

+0

はい私は.. $ table-> foreign( 'c_id_fk') - >参照( 'id') - > on( 'pm_convo');というテーブルをpm_convo_replysというテーブルに持っています。 – BigJobbies

+0

その場合は、2回の 'drop'呼び出しを回してください。 –

答えて

46

pm_convo_replysは、このようにあなたがpm_convo最初を削除することはできません、pm_convoを参照する外部キーを持っていますpm_convo_replysの外部キー制約に違反することなく

pm_convo_replys最初にを削除する必要があります。

public function down() 
{ 
    Schema::drop('pm_convo_replys'); 
    Schema::drop('pm_convo'); 
} 
57

私は、これはそれを行うには良い方法だと思います:

public function down() 
{ 
    DB::statement('SET FOREIGN_KEY_CHECKS = 0'); 
    Schema::dropIfExists('tableName'); 
    DB::statement('SET FOREIGN_KEY_CHECKS = 1'); 
} 
+4

これは対処する外来キーがたくさんある場合、これを行う簡単な方法ですが、これはすべてのタイプのデータベースで機能しますか?あなたの移行が誤って外部キーチェックをオフにするのが妥当でない場合、開発中にも可能ではありませんか?個人的に私はそのクリーナーを正しく注文するだけです – WebweaverD

+0

Thx、このソリューションは、私のデータベース種子の切り捨てで私の問題を解決しました。 – ke20

+0

ここで 'dropIfExists'を使うのは賢明ではないと思います。原則として、データベースの現在の状態に頼っているマイグレーションを、あなたが思っているものにすることを書いたほうがよいと思います。データベースの状態が、 'down'関数が実行されているとき(テーブルが存在しない場合)と異なる場合、あなたの' up'関数に何かがひどく間違っている可能性があります。まずそれを修正してください。 –

3

は、私はまた、問題のこの種に直面し、それをこのよう

Schema::dropIfExists('tableNameChild'); 
    Schema::drop('tableNameParents'); 
5

を行うことを好みます。移行ファイルの順序はここでの主な問題です。最適な方法は、1つずつマイグレーションファイルを作成することです。メインエンティティは最初に作成する必要があります。移行ファイルを作成するたびに、移行が更新される必要があります。 (php artisan migrate:refresh付き)

@abkrimと@Eric

public function down() 
{ 
    Schema::disableForeignKeyConstraints(); 
    Schema::drop('tableName'); 
    Sch‌​ema::enableForeignKe‌​yConstraints(); 
} 
2

によると、私は、これが最も正しいアプローチだと思う:

public function down() 
{ 
    Schema::table('[table]', function (Blueprint $table) { 
     $table->dropForeign('[table]_[column]_foreign'); 
     $table->dropColumn('[column]'); 
    }); 
} 
関連する問題