gpt4 book ai didi

sql - 一次删除相关信息,避免嵌套查询(PostgreSql)

转载 作者:行者123 更新时间:2023-11-29 13:22:51 24 4
gpt4 key购买 nike

首先,我有几个嵌套结构的表,我需要通过父表 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

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

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

我现在使用的示例:

DELETE FROM Room WHERE house_id IN (SELECT house_id FROM House WHERE city_id IN (SELECT city_id FROM City WHERE country_id = :country_id))
DELETE FROM House WHERE city_id IN (SELECT city_id FROM City ...

有没有更紧凑的方法来做到这一点? (这里性能是最重要的..)

最佳答案

如果 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

这指示数据库,无论何时删除给定房间引用的房屋,也必须删除房间。如果您一直将其设置为层次结构,则更高级别的删除将“级联”到所有较低级别。 (当您在列定义中声明约束时,可以使用类似的语法。)

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

关于sql - 一次删除相关信息,避免嵌套查询(PostgreSql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38726703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com