web-dev-qa-db-ja.com

外部キーのドロップに関する問題

私の外部キーはその自分のテーブルに関連しています。これは階層のある投稿を生成することでした。

データベースに列をドロップしようとすると、次のエラーが発生します。

1553 - Cannot drop index 'post_field_properties_parent_id_index': needed in a foreign key constraint

これはコードです:

public function down()
{
        Schema::table( "post_field_properties", function( $table )
        {
            $table->dropForeign('parent_id');
            $table->dropColumn('parent_id');
        } );
}

私がそれを行うことができると思われる唯一の方法は、phpmyadminに移動して外部キー自体を削除することです。次に、列をドロップします。

14
Jimmyt1988

私自身のプロジェクトのためにこれを理解しました。外部キーを削除する場合は、制約内のテーブル名と列を連結してから、名前の末尾に「_foreign」を付ける必要があります。

http://laravel.com/docs/5.1/migrations#foreign-key-constraints

public function down()
{
        Schema::table( "post_field_properties", function( $table )
        {
            $table->dropForeign('post_field_properties_parent_id_foreign');
            $table->dropColumn('parent_id');
        });
}
21
atm

方法は次のとおりです。

1)データベースにログインし、外部キー関係の名前を検索します。 phpmyadminを使用している場合は、テーブルに移動し、[構造]タブをクリックし、[リレーションビュー]リンクをクリックして、読み込まれるまで数秒待ちます。 「制約名」フィールドを検索します。私の例では、これは「contribution_copyright_id_foreign」です。

2)Laravel移行スクリプトに移動します(またはスクリプトを作成します)。トリックは、最初に外部キーの関係を削除してから、列を削除することです。

public function down()

 {

        Schema::table('contribution', function(Blueprint $table){

            $table->dropForeign('contribution_copyright_id_foreign');

            $table->dropColumn('copyright_id');

        });

外部キーが存在するテーブルを削除する場合は、最初に外部キーの関係も削除する必要があります。

ここ からコピー

それが誰かを助けることを願っています

6
Yousef Altaf

列名の最後に「_foreign」を配置してみてください。例えば:

public function down()
{
        Schema::table( "post_field_properties", function( $table )
        {
            $table->dropForeign('parent_id_foreign');
            $table->dropColumn('parent_id');
        });
}
1
Nick Law

外部キーの名前を確認するには、最初にデータベースを.sqlにバックアップします

そこにあなたはこのようなあなたの外部キーの名前を見るでしょう:

...
KEY `employees_parent_id_foreign` (`parent_id`),
CONSTRAINT `employees_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `laravel_article` (`id`) ON DELETE CASCADE
...

私の場合はlaravel 5.4で、次の形式で始まります:tablename_columnname_foreign

だからあなたのlaravel(ここでは従業員テーブルから外部キーを削除しようとしています)

Schema::table("employees", function( $table )
{
    $table->dropForeign('employees_parent_id_foreign');
    $table->dropColumn('parent_id');
});
1
Anthony Kal