1

我有一个包含 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 中的 Person Delete person WHERE Name='John'; 这也应该删除 Residents 中与 Johns personId 匹配的任何行。现在 John 也有一个或多个地址,在 Residents 表中与他相连。现在,当我删除 John 时,我需要删除他在地址表中连接到的所有地址。作为最后一个约束,我需要确保没有其他人连接到我将要删除的地址。如果有另一个人连接,我不应该删除地址表中的地址

4

2 回答 2

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;
于 2013-09-19T18:28:25.130 回答
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条目本身。

于 2013-09-25T19:38:49.193 回答