一次删除所有相关信息并避免嵌套查询(PostgreSql)

时间:2016-08-02 17:14:32

标签: sql postgresql

首先,我有几个具有嵌套结构的表,我需要通过父表ID删除所有表中的信息。

例如,四个表:

:1c: user1:password:17002:0:99:7:::
:2d: user2:password:17003:0:99:7:::
:1c: username1:password:17002:0:99:7:::
:3a: newUser:password:17005:0:99:7::: 

我需要删除所有基于country_id的信息(国家本身)。

现在我使用嵌套查询,我担心它会使系统超载。

我现在使用的示例:

Country
country_id | country_name

City
city_id | country_id | city_name

House
house_id | city_id | house_name

Room
room_id | house_id | room_name

还有更紧凑的方法吗? (表演在这里是最重要的..)

2 个答案:

答案 0 :(得分:1)

如果Room.house_id是引用House.house_id的外键,依此类推,则可以使用级联删除。也就是说,如果你有

foreign key (house_id) references House(house_id)

然后成功

foreign key (house_id) references House(house_id)
    on delete cascade

指示数据库每当删除给定房间引用的房屋时,也必须删除房间。如果你在层次结构中一直向上设置,那么在更高级别删除将" cascade"到所有较低的水平。 (在列定义中声明约束时,可以使用类似的语法。)

请注意,这是一个完整的数据库特性,但不是特定于查询的行为。启用级联删除是危险的,因为它可能会无意中删除大量数据。此外,它的主要优点是简单。它可能会比您提供的查询序列执行得更好,因为只需要一个查询,并且因为您不需要较低级别的子查询,但差异可能不足以让您注意到。 / p>

答案 1 :(得分:0)

此查询更简单,如果您按@John Bollinger的建议使用delete cascade,那么它是您唯一需要的:

delete from room
using
    house
    inner join
    city using (city_id)
where
    city.country_id = :country_id and
    room.house_id = house.house_id