我试图从一个表中删除某个字段,我希望它从另一个表中删除所有相关字段(包含相应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中所有相关的行?
答案 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表中的所有数据。因此,在使用大表时不要这样做......