首先,我有几个具有嵌套结构的表,我需要通过父表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
还有更紧凑的方法吗? (表演在这里是最重要的..)
答案 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