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

Drizzle是否支持WITH子句嵌套INSERT实现双表关联插入?

Drizzle是否支持WITH子句中包含INSERT的跨表原子插入操作?

Drizzle完全支持这种通过CTE(WITH子句)包含INSERT语句实现的跨表原子插入操作,你的思路是正确的,仅需对代码做少量语法调整即可正常运行。

正确实现代码示例

// 定义CTE:插入用户记录并返回生成的id
const userCTE = db.$with("user").as(
  db.insert(users)
    .values({ /* 填入用户字段值,例如 name: "张三", email: "zhangsan@example.com" */ })
    .returning({ id: users.id })
);

// 基于CTE插入settings记录,关联新用户的id
const insertedSetting = await db
  .with(userCTE)
  .insert(settings)
  .values({
    user_id: sql`(SELECT id FROM ${userCTE})`,
    /* 填入settings其他字段值,例如 theme: "dark", notifications_enabled: true */
  })
  .returning({ id: settings.id });

对应的生成SQL

该代码会生成你预期的SQL语句:

WITH user AS (
  INSERT INTO users (...)
  VALUES (...)
  RETURNING id
)
INSERT INTO settings (user_id, ...)
VALUES ((SELECT id FROM user), ...)
RETURNING id

这个操作具备原子性:要么users和settings表的记录都插入成功,要么都失败,完全符合创建用户时同步初始化设置的业务需求。

Drizzle虽然文档中更多展示了WITH子句结合SELECT/UPDATE的场景,但它完全支持CTE中包含INSERT语句的用法,这是对标准SQL语法的原生支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:43:13