我有两个包含以下列的表:
SUMMARY(sum_id, sum_number) and DETAILS(det_id, det_number, sum_id)
我想在ID列表中使用det_id删除表DETAILS
中的行,这可以通过以下方式完成:
DELETE FROM details WHERE det_id in (1,2,3...)
BUT
同时,如果SUMMARY
summary.sum_id=details.sum_id
UPDATE summary SET sum_number-=somefunction(details.det_number)
WHERE summary.sum_id=details.sum_id
此外,如果SUMMARY
sum_number<=0
表中删除行会非常棒
醇>
如何以智能方式完成所有这些工作?
如果我从一开始就知道这两个ID:details.det_id
(删除)和summary.sum_id
对应details.det_id
答案 0 :(得分:2)
你没有指定DBMS所以我假设PostgreSQL。
您可以使用新的可写CTE功能使用单个语句执行此操作:
with deleted as (
delete from details
where det_id in (1,2,3...)
returning details.*
),
new_summary as (
update summary
set sum_number = some_function(deleted.det_number)
from deleted
where delete.sum_id = summary.sum_id
returning summary.sum_id
)
delete from summary
where sum_number <= 0
and sum_id in (select sum_id from new_summary);
外部删除中的in
条件并非绝对必要,但您可能没有不使用的CTE定义,因此条件可确保实际使用new_summary
CTE声明。此外,它可能会稍微提高性能,因为只检查更改的摘要行(不是全部)。
答案 1 :(得分:0)
无法在单个语句中执行所有这些操作。你必须做这样的事情:
UPDATE summary SET sum_number = somefunction(details.det_number)
FROM summary INNER JOIN details ON summary.sum_id = details.sum_id
DELETE FROM details WHERE det_id IN (1,2,3,...)
DELETE FROM summary WHERE sum_number <= 0
答案 2 :(得分:0)
我会使用触发器...然后数据库负责删除。
使用更新触发器,一旦/如果更新成功,将触发可以根据需要执行多少操作的触发器...即,它可以执行2次删除。
有一个例子,请阅读本教程:
来自stackoverflow的http://www.mysqltutorial.org/create-the-first-trigger-in-mysql.aspx这个答案(http://stackoverflow.com/questions/6296313/mysql-trigger-after-update-only-if-row-has-changed)也提供了一个很好的例子。< / p>