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 문을 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"