PHP SQLite删除级联上带有外键的多个条目

时间:2012-08-09 15:18:50

标签: mysql sql mysqli

我试图从一个表中删除某个字段,我希望它从另一个表中删除所有相关字段(包含相应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中所有相关的行?

1 个答案:

答案 0 :(得分:1)

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

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

然后第一个嫌疑人是您的表使用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表中的所有数据。因此,在使用大表时不要这样做......