【问题标题】:Sequelize "ignoreDuplicate: true" increments primaryKey?续集“ignoreDuplicate:true”增加primaryKey?
【发布时间】:2020-10-25 22:03:13
【问题描述】:

我在我的 node js 项目中使用 sequelize 和 Postgresql。 我正在解析一些表并在我的数据库中更新它的副本。想象一下,如果我此刻在外部表中有 50000 条记录,10 分钟后的差异约为 5%。我不需要删除,只需要创建新的。我用过

Model.bulkCreate(data, { ignoreDuplicates: true });

在数据库中进行 2 小时的工作解析后,计数约 100 000 条记录,但最后约 1 000 000 条记录的 id。看起来像 ignoreDuplicates: true autoincrements id。如何在没有太多 cpu 使用的情况下避免它? updateOnDuplicate 是否也在做同样的事情?

我找到的最快的方法是

const _ = require('lodash');

// some code
let existing = await Model.findAll({ attributes: [uniqColumn] });

let toCreate = _.differenceBy(data, existing, uniqColumn);
await Model.bulkCreate(toCreate);

【问题讨论】:

  • 你能显示一个对应于 t Model.bulkCreate(data, { ignoreDuplicates: true }); 的 SQL 查询吗(例如尝试插入 1 行)?
  • @Anatoly, Executing (default): INSERT INTO "table_name" ("id","col1") VALUES (DEFAULT,'value1') ON CONFLICT DO NOTHING RETURNING "id","col1","col2", ...; 其中 col1 是 uniq
  • INSERT 对我来说看起来不错,它只是忽略了所有通过任何唯一约束与现有行冲突的传入行。您可以手动执行一个包含相同唯一列值的INSERT 并检查id 是否增加了吗?
  • @ВладимирГоворухин 有什么更新吗?我有同样的问题

标签: node.js postgresql sequelize.js


【解决方案1】:

如果您使用 PostgreSQL sequence 生成唯一列,那么即使由于冲突未插入行,仍会使用序列值。 见next_val

重要提示:为避免阻塞从同一序列中获取数字的并发事务,nextval 操作永远不会回滚;也就是说,一旦获取了一个值,它就被认为是已使用的,并且不会再次返回。即使周围的事务稍后中止,或者调用查询最终没有使用该值也是如此。例如,带有 ON CONFLICT 子句的 INSERT 将计算要插入的元组,包括执行任何所需的 nextval 调用,然后检测任何可能导致其遵循 ON CONFLICT 规则的冲突。这种情况会在赋值序列中留下未使用的“漏洞”。因此,PostgreSQL 序列对象不能用于获取“无间隙”序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2016-01-05
    • 2020-04-18
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多