SQL 删除

你可以删除表中的所有行:

await db.delete(users);

你可以使用过滤器和条件进行删除:

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

限制

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;

排序依据

使用 .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));

// 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;

删除并返回

PostgreSQL
SQLite
MySQL
SingleStore

你可以删除一行并在 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 });

WITH DELETE 子句

查看如何在 selectinsertupdate 中使用 WITH 语句

使用 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"