How to delete a row ONLY in parent table, which is referenced by a Foregin Key from the child table

StackOverflow https://stackoverflow.com/questions/22245084

Frage

I want to delete a row/tuple from a parent table, but it is throwing an error message because it has a FOREIGN KEY reference in its child table.

However, in my case I want to delete the record only from the parent table and maintain the data in the child table.

Is it possible to achieve this?

I know the usage of ON DELETE CASCADE, but I want to know if there is a solution for the secenario I described?

War es hilfreich?

Lösung

It is possible with some agreements in your data. To maintain child table data you'll have to do ON DELETE SET NULL. This will leave data, but set FK to NULL value (in child table). And that is because of data-integrity: while you can keep your data, your FK can not refer to non-existent row of parent table in terms of enforcing FK constraint. Thus, it will be set to NULL by this.

If you want to "save" value of FK - then you definitely should not use FK at all because such behavior violates what FK is. So then just don't use that constraint, but be aware of possible integrity fails.

Andere Tipps

The point of a foreign key constraint is to prevent orphan records in the child table. So, no, it's not possible to do that, unless you drop the foreign key relationship.

If you rely on 'ON DELETE CASCADE', then deleting the parent record will result in all the corresponding children to be deleted.

If you want to delete the parent, but keep the children, you need to drop the foreign key constraint, or set the constraint to be 'ON DELETE SET NULL'. If you set 'ON DELETE SET NULL', then when you delete the parent record, the child records will remain, but the foreign key column value will be set to NULL.

delete a row ONLY in parent table, which is referenced by a Foregin Key from the child table

If Multiple table has been mapped in one table in that case all foreign key i.e :-

$table->integer('customer_id')->unsigned()->nullable();
$table->foreign('customer_id')->references('id')
                          ->on('customers')->onDelete(`SET NULL`); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top