1

質問を書いたときに多くの回答の提案を見たので、これは何度も回答されていることを知っていますが、実際にはどれも正しい回答を得られません。

新しいフィールドをテーブルに追加して、laravel で artisan migrate を使用しようとすると、エラーが発生します

General error: 1215 Cannot add foreign key constraint (SQL: alter table `pages` add constraint pages_page_status_foreign foreign key (`page_status`) references `page_status` (`status_value`))

しかし、同じことを行う前にエラーが発生しなかったのに、なぜエラーが発生するのかわかりません。考えられる唯一の答えは、同じテーブルに2つ以上の外部キーを持つことはできないということです。ここに私の移行機能があります

class CreateStatusTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('page_status', function($table) {
        $table->increments('id');
        $table->string('status_name');
        $table->integer('status_value')->unsigned();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('page_status');
}

}

これはステータス テーブル用で、これを使用してページ テーブルに新しいフィールドを追加する必要があります。

class AddStatusToPagesTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('pages', function($table) {
        $table->integer('page_status')->unsigned();

        $table->foreign('page_status')->references('status_value')->on('page_status');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('pages', function($table) {
        $table->dropForeign('pages_page_status_foreign');
    });
}

}

そして、これがエラーが表示される場所です。何らかの理由で、page_statusフィールドの外部キーをページテーブルに設定できません。

私は自分のローカルホストで xampp インストールを使用しています。phpmyadmin では、テーブルが innodb に設定されていることがわかります。実際にはすべてがデフォルトで innodb に設定されています。page_statusフィールドを見て、ページテーブルのデータベース内で、リレーションを使用できるよりも最初にインデックスを設定する必要があります。インデックスに設定されていない理由はわかりませんが、そのテーブルには既にインデックスとしてIDがあり、外部キーとして作成者があります。

この前に、ページテーブルを作成してこれを使用するときにいくつかのフィールドも追加しました

class CreatePagesTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('pages', function($table){
        $table->increments('id');
        $table->integer('author')->unsigned();
        $table->foreign('author')->references('id')->on('users');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('pages');
}

}

移行を使用しても問題はありませんでした。うまく機能し、作成者は外部キーとして設定されています。

では、なぜ今新しい外部キーを追加できないのでしょうか?

4

2 に答える 2

1

これは、現在のレコードが条件を満たさない場合、外部キーを追加できないことが原因であると考えられます。オプションの場合page_status、フィールドを null 可能にします。

$table->integer('page_status')->unsigned()->nullable();

null 可能にせず、後で有効な外部キー値を挿入する場合は、外部キー チェックを一時的に無効にすることができます。

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

Schema::table('pages', function($table) {
    $table->integer('page_status')->unsigned();
    $table->foreign('page_status')->references('status_value')->on('page_status');
});

DB::statement('SET FOREIGN_KEY_CHECKS = 1');
于 2015-01-29T18:15:16.233 に答える
0

テーブルに新しいフィールドを追加した後、そのフィールドにインデックスを設定する必要があるため、フィールドをインデックスとして設定するための移行にさらに一歩が必要です。

最初の移行で「作成者」フィールドを追加したときに自動的にインデックスとして作成された理由はまだわかりませんが、この場合は、次のようにインデックスを追加で設定することで機能しました。

    Schema::table('pages', function($table) {
        $table->integer('status')->unsigned()->nullable();
        $table->index('status');

        $table->foreign('status')->references('status_value')->on('page_status');
    });
于 2015-01-29T22:25:36.337 に答える