0

我已经进行了搜索,但没有找到我想要的东西,如果已经有人问过这个问题,我深表歉意......

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

我有一个表“成员”,其中有一个“地址”表的外键。

成员表:

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

4 回答 4

0

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

于 2013-05-12T13:58:23.873 回答
0

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

于 2013-05-12T14:26:29.053 回答
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会创建一个可能会影响性能的临时表,因此我不确定这是否是理想的解决方案。但我认为它确实有效。

于 2013-05-12T14:42:28.487 回答
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

请注意,由于 PRIMARY KEY 约束,如果对它的任何引用仍然未完成,第 4 步将失败,但如果您刚刚删除了最后一个引用,则成功。

于 2017-07-06T19:57:40.160 回答