如何仅在父表中删除行,该表由子表中的外键引用

时间:2014-03-07 08:29:37

标签: sql foreign-keys foreign-key-relationship

我想从父表中删除一个行/元组,但它会抛出一条错误消息,因为它的子表中有一个FOREIGN KEY引用。

但是,在我的情况下,我想仅从父表中删除记录并在子表中维护数据

有可能实现这个目标吗?

我知道ON DELETE CASCADE的用法,但我想知道我所描述的场景是否有解决方案?

3 个答案:

答案 0 :(得分:4)

您的数据中可能存在某些协议。要维护子表数据,您必须执行ON DELETE SET NULL。这将保留数据,但将FK设置为​​NULL值(在子表中)。这是因为数据完整性:当你可以保留你的数据时,你的FK 不能引用不存在的父表行执行{{1约束。因此,它将被设置为FK

如果你想“保存” FK的值 - 那么你绝对不应该使用FK,因为这样的行为违反了FK的行为。那么就是不要使用那个约束,但要注意可能的完整性失败。

答案 1 :(得分:3)

外键约束的要点是防止子表中的孤立记录。所以,不,除非你放弃外键关系,否则不可能这样做。

如果你依赖'ON DELETE CASCADE',那么删除父记录将导致所有相应的孩子被删除。

如果要删除父项,但保留子项,则需要删除外键约束,或将约束设置为“ON DELETE SET NULL”。如果设置'ON DELETE SET NULL',那么当您删除父记录时,子记录将保留,但外键列值将设置为NULL。

答案 2 :(得分:0)

仅在父表中删除一行,该子表由子表

中的Foregin Key引用

如果在一个表中映射了多个表,那么所有外键都是: -

$table->integer('customer_id')->unsigned()->nullable();
$table->foreign('customer_id')->references('id')
                          ->on('customers')->onDelete(`SET NULL`);