【发布时间】:2021-01-10 18:20:11
【问题描述】:
我有一个列名为“ids”的 postgres 表。
+----+--------------+
| id | ids |
+----+--------------+
| 1 | {1, 2, 3} |
| 2 | {2, 7, 10} |
| 3 | {14, 11, 1} |
| 4 | {12, 13} |
| 5 | {15, 16, 12} |
+----+--------------+
我想将行与至少一个公共数组元素合并,并从中创建一个新行(或合并到一个现有行中)。所以最终表格如下所示:
+----+--------------------------+
| id | ids |
+----+--------------------------+
| 6 | {1, 2, 3, 7, 10, 14, 11} |
| 7 | {12, 13, 15, 16} |
+----+--------------------------+
结果表中数组元素的顺序并不重要,但它们必须是唯一的。
这些行是独立于另一个系统添加的。例如,我们可以添加一个新行,其中 id 为 {16, 18, 1}。
现在,为了确保我们将所有行与至少一个公共数组元素组合在一起,我正在我的服务器 (Node.js) 中进行计算。
因此,在创建新行之前,我会使用以下方法提取数据库中至少有一个共同项的所有现有行:
await t.any('SELECT * FROM arraytable WHERE $1 && ids', [16, 18, 1])
这给了我所有至少有 16、18 或 1 的行。然后我将这些行与 [16,18,1] 合并并删除重复项。
有了这个新数组,我删除了上面提取的所有现有行,并将这个新行插入到数据库中。如您所见,大部分工作都是在 Node.js 中完成的。
我正在尝试创建一个触发器,而不是这个触发器,它会在我添加新行后立即为我执行所有这些步骤。我该如何使用触发器来执行此操作。另外,有没有更好的方法?
【问题讨论】:
标签: postgresql