【问题标题】:How to update data with duplicate values using Knex?如何使用 Knex 更新具有重复值的数据?
【发布时间】:2021-12-22 21:50:30
【问题描述】:

假设我有这个数据数组:

const ids = [
  '7d8206d2-74bc-4b90-a237-37f92486cde4',
  'e594fe7f-d529-4a2f-ab24-ffc4e102268c',
  '7d8206d2-74bc-4b90-a237-37f92486cde4'
]

如您所见,有重复的 id,当我想像这样更新它时:

        await knex("products")
            .increment("purchasesCount")
            .whereIn("id", ids) 

在我的purchasesCount 列中,我可以看到值(1, 1),但由于ID 重复,它应该是(2, 1)。有办法解决吗?

【问题讨论】:

  • 您要更新/增加第一个副本还是最后一个副本?如果您有两个以上的重复项,您希望如何更新它们?

标签: javascript mysql node.js express knex


【解决方案1】:

最简单的解决方案是每次购买发出一次查询,如下所示:

for (const id of ids) {
  await knex("products").increment("purchasesCount").where({ id: id });
}

如果由于某种原因(例如性能)这是不可能的,那么您有 2 个选择:

  1. 在内存中进行分桶并计算您获得的每个 ID 的数量。然后,使用.whereIn("id", idsWithThisCountOnly) 进行一系列增量。因此,在上面的示例中,您将执行 2 次更新,一次用于在数组中仅找到一次的所有 id,一次用于所有加倍的 id。您可能需要 id => count 的 Map 来计算重复项,并且稍后需要将其反转为 count => idsWithThisCountOnly[] 的形式。
  2. 根本不将计数存储在数据库中。在检索数据时,只存储重复的 ID,并使用 GROUP BYCOUNT。这应该会提供更好的写入性能(INSERT 通常比 UPDATE 更快),但会增加存储大小并降低读取速度。

如果您已经有一个包含行项目的“交易”或“销售”表并且不经常访问摘要数据,则选项 2 可能更可取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多