表格书(book_id,title)是主表。 表book_version(version_id,book_id,publisher)是另一个表
book_id是 book 和外键(在删除级联上更新级联)到 book_version 的主键。他们有一对多的关系,因为可能有同一本书的几个版本
显然,要删除图书的所有版本:DELETE FROM book WHERE book_id = $some_id
但是,如果我想删除特定版本,我们有两种情况:
DELETE FROM book_version WHERE version_id = $some_id
我知道可以使用count来完成(我计算book_version中的行数。如果它不止一个,请转到案例1.否则转到案例2)。但我想在单个查询中实现这一点,不包括两个不同的查询或(如果可能的话)if语句。也许我可以在数据库结构中做一些事情 - 它不一定是因为查询。任何想法都非常感谢。
答案 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 ...