【问题标题】:Cascade delete in many-to-many tables多对多表中的级联删除
【发布时间】:2018-08-13 09:51:51
【问题描述】:

假设有一组邮件列表,其中个人可能是多个列表的成员。我已经建立了一个连接表:

members -> members2lists <- lists

如果用户只想从一个列表中删除成员,似乎只需要删除 members2lists 表中的相应行。但是,如果它们只是一个列表的成员,我如何指定级联以免它们成为孤儿?换句话说,当且仅当他们是我要从中删除他们的列表的成员时,我如何删除他们?

我将 PHP 和 mySQL 与 InnoDB 表一起使用。

【问题讨论】:

  • 由于 members 不依赖于 members2lists 我怀疑级联删除不会完成此操作。也许members2lists 上的触发器会从members 中删除任何本身未找到的ID?

标签: mysql cascading-deletes


【解决方案1】:

感谢大卫的回复。我已经通过这种方式解决了问题(我希望前两个函数是不言自明的):

$memberID = getIDFromMembers($pdo, $email);
$currListID = getIDFromList($pdo, $listname);

// remove record from join table
$sql = 'DELETE FROM `members2lists` WHERE `member_fk` = :member AND `list_fk` = :list';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':member', $memberID);
$stmt->bindParam(':list', $currListID);
$stmt->execute();

// check if another record exists in the join table for the same member
$sql = 'SELECT `member_fk` FROM `members2lists` WHERE `member_fk` = :member';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':member', $memberID);
$stmt->execute();
$row = $stmt->fetch();

if($row === false) 
{
  // there isn't, the member is an orphan, so delete
  $sql = 'DELETE FROM `members` WHERE `member_email` = :email';
  $stmt = $pdo->prepare($sql);
  $stmt->bindParam(':email', $email);
  $stmt->execute();
}

我很高兴收到来自成员的 cmets 关于改进此代码的方法!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多