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;
위 예제에서는 users
테이블에서 name
이 ‘Dan’인 레코드 중 최대 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;
-- 이름과 이름2를 기준으로 오름차순 정렬
delete from "users" where "users"."name" = $1 order by "name", "name2";
-- 이름은 오름차순, 이름2는 내림차순으로 정렬
delete from "users" where "users"."name" = $1 order by "name" asc, "name2" desc;
삭제 후 반환하기
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
절을 사용하면 복잡한 쿼리를 더 작은 하위 쿼리로 나누어 간단하게 만들 수 있습니다. 이 하위 쿼리를 공통 테이블 표현식(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"