我已经进行了搜索,并且没有找到我正在寻找的内容,如果已经被问过这么道歉......
我正在使用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;";
如果我删除了某个用户,我只想在其他用户也不在该地址时删除该地址。
所以,我的问题是,是否有一些聪明的反向级联删除,数据库会知道如何执行此操作,或者我是否需要坚持使用现有方法锁定两个表,检查条件,然后只删除如果没有其他人引用它的地址?
答案 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)
我知道这是一个老问题,但更简单的答案是:
select addr_id into @addr_id from __JEH_MEMBER where ...
delete from __JEH_MEMBER where ...
delete from __JEH_ADDRESS where id = @addr_id
请注意,由于PRIMARY KEY约束,如果有任何引用尚未完成,则步骤4将失败,但如果您刚删除了最后一个引用,则步骤4将成功。