1

我正在尝试从一个表中删除某个字段,并且我希望它从另一个表中删除所有关联的字段(包含适当 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 中的所有关联行?

4

1 回答 1

1

不,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 表中复制所有数据。因此,请勿在使用时在大桌子上执行此操作...

于 2012-08-09T15:29:20.540 回答