postgresql 细雨-奥姆:如何在父表和子表中插入?

x6yk4ghg  于 2023-05-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(122)

SQL新手如何插入父表和子表?
假设下表

import { integer, pgTable, serial, text } from 'drizzle-orm/pg-core';

export const users = pgTable('user', {
    id: serial('id').primaryKey(),
    name: text('name'),
});

export const tokens = pgTable('token', {
    id: serial('id').primaryKey(),
        userId: text("userId").notNull().references(() => users.id, { onDelete: "cascade" }),
        token: string("token"),
});

要使用令牌创建新用户...我觉得手动看起来像这样…

const newUser = await db.insert(users).values({name: "Billy"}).returning();
const token = await db.insert(token).values({userId: newUser.id, token: "123"}).returning();

这是正确的方法吗?或者这个事务应该使用视图或事务吗?

cld4siwp

cld4siwp1#

请注意,我对毛毛雨和CRUD SQL的东西也很陌生,所以可能有一种“更好”的方法来做到这一点,但我相信您需要将其 Package 在transaction中。
基本上,您将返回您创建的新用户的id,并使用它在tokens表中插入一条新记录(这是您已经在做的事情),但是如果发生错误,数据库将“回滚”,什么也不会发生。

await db.transaction(async (tx) => {
  const result = await db.insert(users).values({ name: 'billy' }).returning({ userId: users.id });
  
  await db.insert(tokens).values({ userId: result[0].userId, token: '123' })
  
});

相关问题