SQL Delete

ν…Œμ΄λΈ”μ˜ λͺ¨λ“  행을 μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€:

await db.delete(users);

필터와 쑰건을 μ‚¬μš©ν•˜μ—¬ μ‚­μ œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

await db.delete(users).where(eq(users.name, 'Dan'));

Limit

PostgreSQL
MySQL
SQLite
SingleStore

.limit()을 μ‚¬μš©ν•˜μ—¬ 쿼리에 limit μ ˆμ„ μΆ”κ°€ν•©λ‹ˆλ‹€ - 예λ₯Ό λ“€μ–΄:

await db.delete(users).where(eq(users.name, 'Dan')).limit(2);
delete from "users" where "users"."name" = $1 limit $2;

Order By

.orderBy()λ₯Ό μ‚¬μš©ν•˜μ—¬ 쿼리에 order by μ ˆμ„ μΆ”κ°€ν•˜κ³ , μ§€μ •λœ ν•„λ“œλ‘œ κ²°κ³Όλ₯Ό μ •λ ¬ν•©λ‹ˆλ‹€:

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

await db.delete(users).where(eq(users.name, 'Dan')).orderBy(users.name);
await db.delete(users).where(eq(users.name, 'Dan')).orderBy(desc(users.name));

// μ—¬λŸ¬ ν•„λ“œλ‘œ μ •λ ¬
await db.delete(users).where(eq(users.name, 'Dan')).orderBy(users.name, users.name2);
await db.delete(users).where(eq(users.name, 'Dan')).orderBy(asc(users.name), desc(users.name2));
delete from "users" where "users"."name" = $1 order by "name";
delete from "users" where "users"."name" = $1 order by "name" desc;

delete from "users" where "users"."name" = $1 order by "name", "name2";
delete from "users" where "users"."name" = $1 order by "name" asc, "name2" desc;

Delete with return

PostgreSQL
SQLite
MySQL
SingleStore

PostgreSQLκ³Ό SQLiteμ—μ„œλŠ” 행을 μ‚­μ œν•˜κ³  λ°˜ν™˜λ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€:

const deletedUser = await db.delete(users)
  .where(eq(users.name, 'Dan'))
  .returning();

// λΆ€λΆ„ λ°˜ν™˜
const deletedUserIds: { deletedId: number }[] = await db.delete(users)
  .where(eq(users.name, 'Dan'))
  .returning({ deletedId: users.id });

WITH DELETE 절

WITH 문을 select, insert, update와 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 방법을 ν™•μΈν•˜μ„Έμš”

with μ ˆμ„ μ‚¬μš©ν•˜λ©΄ λ³΅μž‘ν•œ 쿼리λ₯Ό 곡톡 ν…Œμ΄λΈ” ν‘œν˜„μ‹(CTE)μ΄λΌλŠ” μž‘μ€ ν•˜μœ„ 쿼리둜 λΆ„ν• ν•˜μ—¬ λ‹¨μˆœν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

const averageAmount = db.$with('average_amount').as(
  db.select({ value: sql`avg(${orders.amount})`.as('value') }).from(orders)
);

const result = await db
	.with(averageAmount)
	.delete(orders)
	.where(gt(orders.amount, sql`(select * from ${averageAmount})`))
	.returning({
		id: orders.id
	});
with "average_amount" as (select avg("amount") as "value" from "orders") 
delete from "orders" 
where "orders"."amount" > (select * from "average_amount") 
returning "id"