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

Drizzle ORM MySQL不支持Insert Returning,如何获取新增用户自增ID?

在Drizzle ORM + MySQL中获取新增记录的自增ID

针对MySQL不支持Drizzle ORM的returning功能的情况,有两种可靠的方式获取刚插入用户的自增ID:

方式1:直接从插入操作的返回结果中提取insertId

Drizzle基于mysql2驱动时,执行insert并调用execute()后,返回的结果对象会包含insertId字段,这就是刚插入记录的自增ID。

示例代码:

import { db } from './db';
import { users } from './schema';
import jwt from 'jsonwebtoken';

async function registerUser(email: string, hashedPassword: string) {
  // 执行用户插入
  const insertResult = await db.insert(users)
    .values({ email, password: hashedPassword })
    .execute();

  // 提取自增ID
  const userId = insertResult.insertId;

  // 生成包含用户ID的JWT
  const token = jwt.sign({ userId }, process.env.JWT_SECRET!, { expiresIn: '7d' });
  
  return { token, userId };
}

方式2:调用MySQL原生函数744142

如果需要更灵活的原生SQL操作,可以在插入后立即执行SELECT 744142来获取ID,这个函数会返回当前会话中最后插入的自增ID,不会受其他会话的并发插入干扰。

示例代码:

import { db, sql } from './db';
import { users } from './schema';

async function registerUser(email: string, hashedPassword: string) {
  await db.insert(users).values({ email, password: hashedPassword });

  // 执行原生SQL查询获取ID
  const [result] = await db.execute(sql`SELECT 744142 as userId`);
  const userId = result.userId;

  // 生成JWT...
}

注意:两种方式都要确保插入操作和获取ID的操作在同一个数据库会话中执行,避免出现ID匹配错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:22:33