SQL Delete
테이블의 모든 행을 삭제할 수 있습니다:
await db.delete(users);필터와 조건을 사용하여 삭제할 수도 있습니다:
await db.delete(users).where(eq(users.name, 'Dan'));Limit
PostgreSQL
MySQL
SQLite
SingleStore
MSSQL
CockroachDB
쿼리에 limit 절을 추가하려면 .limit()을 사용합니다 - 예시:
await db.delete(users).where(eq(users.name, 'Dan')).limit(2);delete from "users" where "users"."name" = $1 limit $2;Order By
쿼리에 order by 절을 추가하여 지정된 필드로 결과를 정렬하려면 .orderBy()를 사용합니다:
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));
// order by multiple fields
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;Returning
PostgreSQL
SQLite
MySQL
SingleStore
MSSQL
CockroachDB
PostgreSQL과 SQLite에서는 삭제한 행의 데이터를 반환받을 수 있습니다:
const deletedUser = await db.delete(users)
.where(eq(users.name, 'Dan'))
.returning();
// partial return
const deletedUserIds: { deletedId: number }[] = await db.delete(users)
.where(eq(users.name, 'Dan'))
.returning({ deletedId: users.id });Output
MSSQL
MSSQL에서는 삭제한 행의 데이터를 반환받을 수 있습니다:
await db.delete(users).where(eq(users.name, "Dan")).output();
// partial return
await db.delete(users).where(eq(users.name, "Dan")).output({ deletedId: users.id });WITH DELETE clause
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"