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
相关产品推荐
相关产品推荐

