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

时间:2016-01-14 08:53:08

标签: database postgresql one-to-many

表格书(book_id,title)是主表。 表book_version(version_id,book_id,publisher)是另一个表

book_id是 book 和外键(在删除级联上更新级联)到 book_version 的主键。他们有一对多的关系,因为可能有同一本书的几个版本

显然,要删除图书的所有版本:DELETE FROM book WHERE book_id = $some_id

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

  1. 本书有多个版本,因此只需删除基于version_id的条目:DELETE FROM book_version WHERE version_id = $some_id
  2. 到目前为止只有一个版本。不仅要删除 book_version 中的行,还要删除 book 表中的行
  3. 我知道可以使用count来完成(我计算book_version中的行数。如果它不止一个,请转到案例1.否则转到案例2)。但我想在单个查询中实现这一点,不包括两个不同的查询或(如果可能的话)if语句。也许我可以在数据库结构中做一些事情 - 它不一定是因为查询。任何想法都非常感谢。

2 个答案:

答案 0 :(得分:2)

可以在单个纯SQL查询中完成。 SQL Fiddle

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
    )

答案 1 :(得分:1)

也许可以在这里使用触发器。

类似的东西:

CREATE TRIGGER deleteIfLastVersionIsDeleted AFTER DELETE ON book_version ...