You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Knex.js中获取批量插入的最后插入ID集合?

解决Knex.js批量插入后获取所有插入ID的问题

我之前处理批量插入时也碰到过这个问题,Knex.js的insert方法默认返回行为确实会因数据库类型而异,尤其是批量插入场景下只返回单个ID的情况很常见。下面分情况给你针对性的解决方案:

1. 针对PostgreSQL/SQLite数据库

这两个数据库原生支持INSERT...RETURNING语法,Knex可以直接通过.returning('id')方法获取所有插入的ID数组,修改你的代码即可:

const data = await querybuilder('surveyresponse').insert(varList).returning('id');
// 此时data会返回类似 [183,184,185] 的数组,完全符合你的期望

2. 针对MySQL数据库

MySQL的情况要分版本来看:

版本8.0及以上

MySQL 8.0开始支持INSERT...RETURNING语法,所以同样可以用.returning('id')来获取所有插入ID,代码和上面一致:

const data = await querybuilder('surveyresponse').insert(varList).returning('id');

版本8.0以下(旧版MySQL)

旧版MySQL不支持RETURNING语法,这时候可以通过原生SQL结合自增ID的特性来计算所有插入的ID:

注意:这种方法存在并发风险,如果在你插入的同时有其他操作也往同一张表插入数据,计算出的ID可能不准确,所以优先建议升级MySQL版本。

// 执行批量插入的原生SQL,注意替换成你表的实际字段名
const result = await querybuilder.raw(
  'INSERT INTO surveyresponse (column1, column2, ...) VALUES ?',
  [varList.map(item => [item.column1, item.column2, ...])] // 对应表的字段顺序
);

// 计算所有插入的ID:第一个插入的ID是result[0].insertId,后续依次递增
const insertedIds = Array.from(
  { length: varList.length },
  (_, index) => result[0].insertId + index
);

console.log(insertedIds); // 输出 [183,184,185]

额外注意事项

  • 确保你的surveyresponse表中id字段是自增主键(MySQL用AUTO_INCREMENT,PostgreSQL用SERIAL/BIGSERIAL)
  • 如果使用MySQL,建议使用mysql2驱动,它对Knex的特性支持更完善
  • 批量插入的varList必须是包含多个对象的数组,比如[{name: 'a'}, {name: 'b'}]这样的格式

内容的提问来源于stack exchange,提问作者Maheskumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:04:36