Database 删除一对多关系中的空行(postgresql)
Table book(book_id,title)是主表。 表book\u version(版本号、图书号、出版商)是另一个表 book_id是书籍的主键,是书籍版本的外键(在更新层叠和删除层叠中)。它们之间有一对多的关系,因为同一本书可能有多个版本 显然,要删除一本书的所有版本:Database 删除一对多关系中的空行(postgresql),database,postgresql,one-to-many,Database,Postgresql,One To Many,Table book(book_id,title)是主表。 表book\u version(版本号、图书号、出版商)是另一个表 book_id是书籍的主键,是书籍版本的外键(在更新层叠和删除层叠中)。它们之间有一对多的关系,因为同一本书可能有多个版本 显然,要删除一本书的所有版本:delete FROM book\u id=$some\u id 但是,如果我想删除特定版本,我们有两种情况: 本书有多个版本,因此只需根据版本id删除条目:delete FROM book\u version,其中版
delete FROM book\u id=$some\u id
但是,如果我想删除特定版本,我们有两种情况:
delete FROM book\u version,其中版本id=$some\u id
我知道可以使用count(我计算book_版本中的行数。如果行数超过一行,请转到案例1。否则,请转到案例2)。但我希望在单个查询中实现这一点,而不包括两个不同的查询或(如果可能的话)if语句。也许我可以在数据库结构中做些什么——这不一定是因为查询。任何想法都非常感谢 也许这里可以使用触发器 比如:
CREATE TRIGGER deleteIfLastVersionIsDeleted AFTER DELETE ON book_version ...
它可以在一个简单的SQL查询中完成
听起来是个好主意。我以前从未使用过触发器(我知道,我真丢脸)。但是我会检查一下并让你知道的。谢谢,它像一个符咒一样有效——这正是我想要的。虽然我宁愿找一些挑战或错误,这样我就不会觉得自己没用了。
with dv as (
delete from book_version
where version_id = 2
returning book_id, version_id
)
delete from book b
using dv
where
b.book_id = dv.book_id
and
not exists (
select version_id
from book_version
where
book_id = dv.book_id
and
version_id != dv.version_id
)