web-dev-qa-db-ja.com

Laravel-データを含む既存のテーブルに外部キーを追加します

データを含む既存のテーブルobjectsがあります。次に、holdingsという名前の新しいテーブルを追加し、オブジェクトからholdingsテーブルにリレーションを追加する必要があります。移行ファイルで、私はこれを印刷します:

$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");

移行しようとすると、このエラーが発生します

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
a child row: a foreign key constraint fails (`kolomnaoffice`.`#sql-f10_126` 
CONSTRAINT `objects_holding_id_foreign` FOREIGN KEY (`holding_id`) 
REFERENCES `holdings` (`id`) ON DELETE NO ACTION) (SQL: alter table `objects` add constraint 
`objects_holding_id_foreign` foreign key (`holding_id`) references `holdings` 
(`id`) on delete NO ACTION)

私は正しいデータベース構造(両方ともInnoDB)を持ち、フィールドが存在し、正しいタイプ(int)を持っています。唯一異なるのは、テーブルobjectsにはデータが入力され、テーブルholdingsは新しく空であるということです。

7

_holding_id_列はunsignedである必要があります

新しい移行ファイルを作成して移行します。移行コードは次のようになります。

_Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->change();

    $table->foreign('holding_id')->references('id')->on('holdings');
});
_

change()メソッドは、既存の列の構造を変更するために呼び出されます。

onDelete("NO ACTION")メソッドを呼び出す必要はありません。

12
Mohammad b

Mohammadに感謝しますが、私は_Laravel 5.4_であり、他のテーブルが既に存在するという別のケースがあるため、このソリューションは私にとってうまくいきませんでした。

_Schema::table('objects', function (Blueprint $table) {
    $table->integer('holding_id')->unsigned()->index()->nullable();

    $table->foreign('holding_id')->references('id')->on('holdings');
});
_

index()nullable()を使ってトリックを作りました。

編集index()の必要はありません_nullable()である必要があります

3
Yousef Altaf

外部キーを追加するには、まず、列が符号なしとしてマークされていることを確認してください。

行の前に行を追加するだけです:

$table->integer('holding_id')->unsigned();
$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");
0
ajit