Database 删除一对多关系中的空行(postgresql)

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,其中版

Table book(book_id,title)是主表。 表book\u version(版本号、图书号、出版商)是另一个表

book_id是书籍的主键,是书籍版本的外键(在更新层叠和删除层叠中)。它们之间有一对多的关系,因为同一本书可能有多个版本

显然,要删除一本书的所有版本:
delete FROM book\u id=$some\u id

但是,如果我想删除特定版本,我们有两种情况:

  • 本书有多个版本,因此只需根据版本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
        )