删除一对多关系中的空行(postgresql)
Delete empty rows in one-to-many relationship (postgresql)
Table 书(book_id,书名)是主要的table。
Table book_version (version_id, book_id,publisher) 是另一个 table
book_id 是 book 的主键和 book_version[= 的外键(更新级联删除级联) 29=]。它们是一对多的关系,因为同一本书可能有多个版本
显然,要删除一本书的所有版本:DELETE FROM book WHERE book_id = $some_id
但是,如果我想删除特定版本,我们有两种情况:
- 这本书有好几个版本,根据version_id删除条目即可:
DELETE FROM book_version WHERE version_id = $some_id
- 目前只有一个版本。不仅book_version中的行要删除,book中的行也要删除table
我知道可以使用 count 来完成(我计算 book_version 中的行数。如果超过一,请转到案例 1。否则转到案例 2)。但我想在单个查询中实现这一点,而不包括两个不同的查询或(如果可能)一个 if 语句。也许我可以在数据库结构中做一些事情——不一定是因为查询。非常感谢任何想法。
也许这里可以使用触发器。
类似于:
CREATE TRIGGER deleteIfLastVersionIsDeleted AFTER DELETE ON book_version ...
它可以在一个简单的 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
)
Table 书(book_id,书名)是主要的table。 Table book_version (version_id, book_id,publisher) 是另一个 table
book_id 是 book 的主键和 book_version[= 的外键(更新级联删除级联) 29=]。它们是一对多的关系,因为同一本书可能有多个版本
显然,要删除一本书的所有版本:DELETE FROM book WHERE book_id = $some_id
但是,如果我想删除特定版本,我们有两种情况:
- 这本书有好几个版本,根据version_id删除条目即可:
DELETE FROM book_version WHERE version_id = $some_id
- 目前只有一个版本。不仅book_version中的行要删除,book中的行也要删除table
我知道可以使用 count 来完成(我计算 book_version 中的行数。如果超过一,请转到案例 1。否则转到案例 2)。但我想在单个查询中实现这一点,而不包括两个不同的查询或(如果可能)一个 if 语句。也许我可以在数据库结构中做一些事情——不一定是因为查询。非常感谢任何想法。
也许这里可以使用触发器。
类似于:
CREATE TRIGGER deleteIfLastVersionIsDeleted AFTER DELETE ON book_version ...
它可以在一个简单的 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
)