一种反向级联删除1-many

时间:2013-05-12 13:47:01

标签: php mysql

我已经进行了搜索,并且没有找到我正在寻找的内容,如果已经被问过这么道歉......

我正在使用PHP和MYSQL的组合。

我有一个表'member',带有'address'表的外键。

会员表:

CREATE TABLE __JEH_MEMBER (" .
    "id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, " .
    "title VARCHAR(". self::TITLE_MAX_STRLEN ."), " .
    "forename VARCHAR(". self::NAME_MAX_STRLEN .") NOT NULL, " .
    "surname VARCHAR(". self::NAME_MAX_STRLEN .") NOT NULL, " .
    "addr_id INT NOT NULL, " .
    "bday DATE, " .
    "FOREIGN KEY(addr_id) REFERENCES __JEH_ADDRESS(id)" .
    // Note: No cascade spec here deliberately for now..
") ENGINE=InnoDB;";

地址表:

"CREATE TABLE __JEH_ADDRESS(" .
    "id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT, " .
    "street1  VARCHAR(120) NOT NULL, " .
    "street2  VARCHAR(120), " .
    "street3  VARCHAR(120), " .
    "street4  VARCHAR(120), " .
    "city     VARCHAR(50) NOT NULL, " .
    "state    VARCHAR(50) NOT NULL, " .
    "country  VARCHAR(50) NOT NULL, " .
    "postcode VARCHAR(16) NOT NULL" .       
") ENGINE=InnoDB;";

如果我删除了某个用户,我只想在其他用户也不在该地址时删除该地址。

所以,我的问题是,是否有一些聪明的反向级联删除,数据库会知道如何执行此操作,或者我是否需要坚持使用现有方法锁定两个表,检查条件,然后只删除如果没有其他人引用它的地址?

4 个答案:

答案 0 :(得分:0)

只需删除用户即可。如果找不到删除地址,则搜索具有该地址的其他用户的用户表。

答案 1 :(得分:0)

我认为您必须手动执行此操作,但这可能是删除后类型的触发器。也许这会使事情更快或更通用,因为你可以尝试用依赖项作为参数编写存储过程。

答案 2 :(得分:0)

您可以在左连接上使用多表删除来执行此操作,如下所示:

DELETE m, a
FROM __JEH_MEMBER m
LEFT JOIN __JEH_ADDRESS a ON a.id = m.addr_id
AND (
  SELECT COUNT(*) FROM 
  (SELECT addr_id FROM __JEH_MEMBER) AS x
  WHERE addr_id = m.addr_id
) = 1
WHERE m.id = ???

请注意,(SELECT addr_id FROM __JEH_MEMBER) AS x会创建一个可能会影响性能的临时表,所以我不确定这是否是一个理想的解决方案。但它确实有效。

答案 3 :(得分:0)

我知道这是一个老问题,但更简单的答案是:

  1. 设置外键约束
  2. 找到您要删除的addr_id:select addr_id into @addr_id from __JEH_MEMBER where ...
  3. 删除当前对该地址的引用:delete from __JEH_MEMBER where ...
  4. 尝试删除地址:delete from __JEH_ADDRESS where id = @addr_id
  5. 请注意,由于PRIMARY KEY约束,如果有任何引用尚未完成,则步骤4将失败,但如果您刚删除了最后一个引用,则步骤4将成功。