问题
I am trying to run a migration for a table inventories
that I have created with this migration:
Schema::create('inventories', function (Blueprint $table) {
$table->increments('id');
$table->integer('remote_id')->unsigned();
$table->integer('local_id')->unsigned();
$table->string('local_type');
$table->string('url')->nullable()->unique();
$table->timestamps();
});
I am trying to add a run a migration where I am adding a foreign key to the table:
Schema::table('inventories', function (Blueprint $table) {
$table->foreign('local_id')->references('id')->on('contents')->onDelete('cascade');
});
But, I am getting an error when I try to run the migration:
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
middleton
.#sql-5d6_162a
, CONSTRAINTinventories_local_id_foreign
FOREIGN KEY (local_id
) REFERENCEScontents
(id
) ON DELETE CASCADE ) (SQL: alter tableinventories
add constraintinventories_local_id_foreign
foreign key (local_id
) referencescontents
(id
) on delete cascade)[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
middleton
.#sql-5d6_162a
, CONSTRAINTinventories_local_id_foreign
FOREIGN KEY (local_id
) REFERENCEScontents
(id
) ON DELETE CASCADE )
What am I doing wrong?
回答1:
You probably have some records in the inventories
table with local_id
that does not have corresponding id
in the contents
table, hence the error. You could solve it by one of the two ways:
- Run the migration with
foreign_key_checks
turned off. This will disabled the foreign key constraints for the existing rows (if that's what you want). It's documented here - Insert only those records that have corresponding
id
field incontents
table. You can useINSERT INTO.. WHERE EXISTS
query to filter the records out, and insert only those records.
回答2:
had the same problem. fixed it by adding nullable
to field
Schema::create('table_name', function (Blueprint $table) {
...
$table->integer('some_id')->unsigned()->nullable();
$table->foreign('some_id')->references('id')->on('other_table');
...
});
note that after migration all existed rows will have some_id = NULL
来源:https://stackoverflow.com/questions/47266089/laravel-migration-integrity-constraint-violation-1452-cannot-add-or-update-a