我在两个名为Product
的表Tag
和ProductTag
之间具有 n : m 关系。它只有两列:ProductId
和TagId
。
主键是这两列的组合。
直接插入此表。
但是,有了一组应与产品相关联的新标签,我可以一次选择更新表的选择是什么?
现在,在交易内部,我删除了与产品关联的所有产品标签,并插入“已更新”标签。这项功能有效,简单,并且无需花费很长时间进行编码。
我仍然很好奇如何更好地解决它,甚至使用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的新标签。在单个语句中达到此状态的最佳方法是什么?
答案 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
的主键。