【发布时间】:2022-11-09 02:05:10
【问题描述】:
我正在尝试一次性创建/添加/删除标签。我想获取一个标签名称数组和一个元素 ID,并有效地更新该元素以仅包含数组中的标签。
我有 3 个表,如下所示。
元素:
|id|stuff|
|--|-----|
|1 | ... |
|2 | ... |
标签:
|id|name|
|--|----|
|1 | pg |
|2 |node|
标签地图:
|id|element_id|tag_id|
|--|----------|------|
|1 | 2 | 1 |
|2 | 2 | 2 |
在操作开始时,可以为元素分配任意数量的标签。该操作将从一组标签名称和一个元素 ID 开始。在操作结束时,我希望将具有该元素 id 的元素仅分配给该数组中传入的标签。该数组可能具有尚未在标签表中创建的标签,因此需要插入。
这是我的愚蠢,未优化的解决方案。
BEGIN;
INSERT INTO tags (name)
VALUES (''),(''),('')...
ON CONFLICT DO NOTHING;
DELETE FROM tag_map
WHERE element_id = 'myElemID';
WITH tag_ids AS (
SELECT id FROM tags
WHERE name IN ('','',''...)
)
INSERT INTO tag_map (element_id, tag_id)
SELECT ('myElemID', tag_ids);
COMMIT;
我确信有一种更有效的方法来完成同样的事情。也许甚至可以在一个查询中完成?任何帮助将不胜感激
【问题讨论】:
-
您使用的是什么版本的 Postgres?你可以使用
MERGE。 -
我正在使用 postgres 13.7,所以我无法使用 Merge
-
不要认为只能在一个事务中在一个查询中做到这一点
标签: sql database postgresql performance