从一个表中删除并更新另一个表

时间:2012-09-18 08:42:58

标签: sql sql-update delete-operator

我有两个包含以下列的表:

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

  1. 同时,如果SUMMARY

    ,我需要更新表格summary.sum_id=details.sum_id
    UPDATE summary SET sum_number-=somefunction(details.det_number) 
    WHERE summary.sum_id=details.sum_id
    
  2. 此外,如果SUMMARY

  3. ,从sum_number<=0表中删除行会非常棒

    如何以智能方式完成所有这些工作?

    如果我从一开始就知道这两个ID:details.det_id(删除)和summary.sum_id对应details.det_id

    ,该怎么办?

3 个答案:

答案 0 :(得分:2)

你没有指定DBMS所以我假设P​​ostgreSQL。

您可以使用新的可写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>