SQL ์—…๋ฐ์ดํŠธ

await db.update(users)
  .set({ name: 'Mr. Dan' })
  .where(eq(users.name, 'Dan'));

update์— ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ์ปฌ๋Ÿผ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š” ํ‚ค๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด์—์„œ undefined ๊ฐ’์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค: ์ปฌ๋Ÿผ์„ null๋กœ ์„ค์ •ํ•˜๋ ค๋ฉด null์„ ์ „๋‹ฌํ•˜์„ธ์š”. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธ ๊ฐ์ฒด์— ์‚ฌ์šฉํ•  ๊ฐ’์œผ๋กœ SQL์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

await db.update(users)
  .set({ updatedAt: sql`NOW()` })
  .where(eq(users.name, 'Dan'));

์ œํ•œ

PostgreSQL
MySQL
SQLite
SingleStore

์ฟผ๋ฆฌ์— limit ์ ˆ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด .limit()์„ ์‚ฌ์šฉํ•˜์„ธ์š” - ์˜ˆ๋ฅผ ๋“ค์–ด:

await db.update(usersTable).set({ verified: true }).limit(2);
update "users" set "verified" = $1 limit $2;

์ •๋ ฌ

์ฟผ๋ฆฌ์— order by ์ ˆ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ง€์ •๋œ ํ•„๋“œ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜๋ ค๋ฉด .orderBy()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

import { asc, desc } from 'drizzle-orm';

await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name);
await db.update(usersTable).set({ verified: true }).orderBy(desc(usersTable.name));

// ์—ฌ๋Ÿฌ ํ•„๋“œ๋กœ ์ •๋ ฌ
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name, usersTable.name2);
await db.update(usersTable).set({ verified: true }).orderBy(asc(usersTable.name), desc(usersTable.name2));
update "users" set "verified" = $1 order by "name";
update "users" set "verified" = $1 order by "name" desc;

update "users" set "verified" = $1 order by "name", "name2";
update "users" set "verified" = $1 order by "name" asc, "name2" desc;

returning์„ ์‚ฌ์šฉํ•œ ์—…๋ฐ์ดํŠธ

PostgreSQL
SQLite
MySQL
SingleStore

PostgreSQL๊ณผ SQLite์—์„œ ํ–‰์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const updatedUserId: { updatedId: number }[] = await db.update(users)
  .set({ name: 'Mr. Dan' })
  .where(eq(users.name, 'Dan'))
  .returning({ updatedId: users.id });

with update ์ ˆ

select, insert, delete์—์„œ WITH ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”

with ์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ณตํ†ต ํ…Œ์ด๋ธ” ํ‘œํ˜„์‹(CTE)์ด๋ผ๋Š” ๋” ์ž‘์€ ํ•˜์œ„ ์ฟผ๋ฆฌ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const averagePrice = db.$with('average_price').as(
        db.select({ value: sql`avg(${products.price})`.as('value') }).from(products)
);

const result = await db.with(averagePrice)
		.update(products)
		.set({
			cheap: true
		})
		.where(lt(products.price, sql`(select * from ${averagePrice})`))
		.returning({
			id: products.id
		});
with "average_price" as (select avg("price") as "value" from "products") 
update "products" set "cheap" = $1 
where "products"."price" < (select * from "average_price") 
returning "id"

Update โ€ฆ from

PostgreSQL
MySQL
SQLite
SingleStore

SQLite ๋ฌธ์„œ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ:

UPDATE-FROM ์•„์ด๋””์–ด๋Š” UPDATE ๋ฌธ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์˜ํ•ด ๊ตฌ๋™๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” SQL์˜ ํ™•์žฅ์ž…๋‹ˆ๋‹ค. โ€œ๋Œ€์ƒโ€ ํ…Œ์ด๋ธ”์€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ํŠน์ • ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. UPDATE-FROM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์ƒ ํ…Œ์ด๋ธ”์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•˜์—ฌ ์–ด๋–ค ํ–‰์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ–‰์˜ ์ƒˆ๋กœ์šด ๊ฐ’์ด ๋ฌด์—‡์ด์–ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, PostgreSQL ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค:

WHERE ์กฐ๊ฑด ๋ฐ ์—…๋ฐ์ดํŠธ ํ‘œํ˜„์‹์— ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ…Œ์ด๋ธ” ํ‘œํ˜„์‹

Drizzle๋„ drizzle-orm@0.36.3 ๋ฒ„์ „๋ถ€ํ„ฐ ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค

await db
  .update(users)
  .set({ cityId: cities.id })
  .from(cities)
  .where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))
update "users" set "city_id" = "cities"."id" 
from "cities" 
where ("cities"."name" = $1 and "users"."name" = $2)

-- params: [ 'Seattle', 'John' ]

์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์— ๋ณ„์นญ์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(PostgreSQL์—์„œ๋Š” ์—…๋ฐ์ดํŠธํ•  ํ…Œ์ด๋ธ”์—๋„ ๋ณ„์นญ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

const c = alias(cities, 'c');
await db
  .update(users)
  .set({ cityId: c.id })
  .from(c);
update "users" set "city_id" = "c"."id" 
from "cities" "c"
PostgreSQL
MySQL
SQLite
SingleStore

PostgreSQL์—์„œ๋Š” ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const updatedUsers = await db
  .update(users)
  .set({ cityId: cities.id })
  .from(cities)
  .returning({ id: users.id, cityName: cities.name });
update "users" set "city_id" = "cities"."id" 
from "cities" 
returning "users"."id", "cities"."name"