繁体   English   中英

在删除级联上使用外键删除多个条目

[英]Delete multiple entries with foreign key on delete cascade

我试图从一个表中删除某个字段,我希望它从另一个表中删除所有关联的字段(包含适当 fk 的字段)。

表格1

      id | name | fname

表 2

      id | table1Id | ...

table1Id 被设置为引用 Table1 主键的​​外键,我已经设置了ON DELETE CASCADE

现在我的代码很简单,它从 Table1 中删除行,如下所示:

function deleteWill($Id)
    {
        $stmt = $this->db->stmt_init();
        if($stmt->prepare('DELETE FROM Table1 where id= ?'))
        {
            $stmt->bind_param("i", $Id);
            $stmt->execute();
            $stmt->close();
            return true;
        }
        else
        {
            $stmt->close();
            return false;
        }
    }

但是CASCADE选项不起作用!

这是否与我在 Table2 中有多行具有相同 fk 的事实有关?

如果是这样,我该如何解决这个问题,以便它删除 Table2 中的所有关联行?

不,Table2 中的多行应该不是问题。

没有足够的信息来确定导致您观察到的行为的原因。 如果您的语句成功完成,并且正在从 Table1 中删除预期的行,但没有删除 Table2 中的匹配行...

那么第一个怀疑是您的表使用的是 MyISAM 引擎而不是 InnoDB 引擎。 (MyISAM 不强制执行外键约束,但 InnoDB 强制执行。)输出:

SHOW CREATE TABLE Table1
SHOW CREATE TABLE Table2

将显示正在使用的引擎。 我会从那里开始。 还有一些其他的可能性,比如验证foreign_key_check = 1


要将表的引擎从 MyISAM 更改为 InnoDB:

ALTER TABLE Table1 ENGINE = InnoDB ;

这将需要重建整个表; 它基本上需要创建一个新的 InnoDB 表并从 MyISAM 表中复制所有数据。 所以,不要在大桌子上使用它时这样做......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM