在Node.js的MySQL批量插入中如何传入UNIX_TIMESTAMP()*1000函数
解决方法
方法一:使用MySQL函数生成时间戳(推荐,依赖服务器时间)
批量插入时参数会被自动转义,直接把函数放进values数组会被当作字符串处理,因此需要将函数直接写入SQL语句的占位符模板,仅将动态的price和id作为参数传递:
let values = [ [5000, 1], [6000, 2], [8000, 3] ]; // 为每条记录构造包含函数的占位符 const rowPlaceholders = values.map(() => '(?, ?, UNIX_TIMESTAMP()*1000)').join(','); const query = `INSERT INTO price_table (price, id, log_date) VALUES ${rowPlaceholders};`; // 将二维数组扁平化后作为参数传入 await db.query(query, values.flat());
这种方式既保留了批量插入的效率,又让每条记录的log_date使用MySQL服务器的当前毫秒级时间戳,同时通过参数绑定避免了SQL注入风险。
方法二:在应用层生成时间戳(依赖应用服务器时间)
如果不需要使用MySQL服务器的时间,可以直接在Node.js中生成毫秒级时间戳并加入values数组:
所有记录使用同一时间戳
const currentTimestamp = Date.now(); let values = [ [5000, 1, currentTimestamp], [6000, 2, currentTimestamp], [8000, 3, currentTimestamp] ]; let query = `INSERT INTO price_table (price, id, log_date) VALUES ?;`; await db.query(query, [values]);
每条记录使用各自生成的时间戳
let values = [ [5000, 1, Date.now()], [6000, 2, Date.now()], [8000, 3, Date.now()] ]; let query = `INSERT INTO price_table (price, id, log_date) VALUES ?;`; await db.query(query, [values]);
内容的提问来源于stack exchange,提问作者Himashu
相关产品推荐
相关产品推荐

