更新,插入或删除表集

时间:2019-01-16 11:05:25

标签: sql postgresql

我在两个名为Product的表TagProductTag之间具有 n m 关系。它只有两列:ProductIdTagId

主键是这两列的组合。

直接插入此表。

但是,有了一组应与产品相关联的新标签,我可以一次选择更新表的选择是什么?

现在,在交易内部,我删除了与产品关联的所有产品标签,并插入“已更新”标签。这项功能有效,简单,并且无需花费很长时间进行编码。

我仍然很好奇如何更好地解决它,甚至使用PostgreSQL特定功能也是如此?

示例:

假设您在此表中有3个条目:

product_id | tag_id
-----------+-------
1          | 2
1          | 3
1          | 6

请求到达以更新产品标签,使其看起来如下所示:

product_id | tag_id
-----------+-------
1          | 3
1          | 6
1          | 7

带有tag_id 2的标签已删除,并添加了带有tag_id 7的新标签。在单个语句中达到此状态的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

如果我们要谈论的是标签的“通常”数量(例如说“几十”个标签,而不是“数千个”),那么删除/插入方法并不是一个坏主意。

不过,您可以在一个使用更改的语句中完成此操作:

with new_tags (product_id, tag_id) as (
  values (1,3),(1,6),(1,9)
), remove_tags as (
  delete from product_tag pt1
  using new_tags nt
  where pt1.product_id = nt.product_id
   and pt1.tag_id <> ALL (select tag_id from new_tags) 
)
insert into product_tag (product_id, tag_id)
select product_id, tag_id
from new_tags
on conflict do nothing;

以上假设(product_id,tag_id)被定义为product_tag的主键。

在线示例:https://rextester.com/VVL1293