我有一个包含3个表的简单数据库。
Person (personId[PK], Name, other stuff)
Addresses (AddressId[PK], roade, number, other stuff)
Residents ( personId[FK],AddressId[FK]) The two columns are the PK
如果他是唯一住在那里的人,我需要能够从数据库中删除一个人和他的地址。所以我需要能够找出更多的人是否住在同一个地址。如果是,那么如果不删除地址就让它保留。
我在想的是
我想删除表中的Person使用他的名字删除人员WHERE Name ='John'; 那么那也应该删除与Johns personId匹配的Residents中的任何行。 现在John还有一个或多个地址,在Residents表中连接到他。现在,当我删除John时,我需要删除表格地址中所连接的任何地址。 作为最后一个约束,我需要确保没有其他人连接到我要删除的地址。如果连接了另一个人,我不应该删除表格地址
中的地址答案 0 :(得分:0)
查找包含多个人的地址:
select r.AddressId
from Residents r
group by r.AddressId
having count(*) > 1;
为了得到所有人,你可以这样做:
selects personId
from Residents r join
(select r.AddressId
from Residents r
group by r.AddressId
having count(*) > 1
) a
on r.AddressId = a.AddressId;
答案 1 :(得分:0)
如果问题是保持Addresses
表没有未使用的条目,您只需删除那些在Residents
中没有引用的行(一旦删除了后者)。
因此,假设您的外键未使用ON DELETE CASCADE
定义,请先从Residents
删除
DELETE FROM Residents
WHERE personId IN (
SELECT personId
FROM Person
WHERE Name = 'Name'
);
然后你可以从Adresses
中删除:
DELETE FROM Addresses
WHERE NOT EXISTS (
SELECT *
FROM Residents
WHERE Residents.AddressId = Addresses.AddressId
);
当然,您也会删除Person
条目本身。