データを含む既存のテーブル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
は新しく空であるということです。
_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")
メソッドを呼び出す必要はありません。
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()
である必要があります
外部キーを追加するには、まず、列が符号なしとしてマークされていることを確認してください。
行の前に行を追加するだけです:
$table->integer('holding_id')->unsigned();
$table->foreign('holding_id')->references('id')->on('holdings')->onDelete("NO ACTION");