SQL 更新
await db.update(users)
.set({ name: 'Mr. Dan' })
.where(eq(users.name, 'Dan'));
您传递给 update
的对象应具有与数据库模式中列名匹配的键。对象中值为 undefined
的键将被忽略:要将列设置为 null
,请传递 null
。您可以将 SQL 作为值传递以用于更新对象,如下所示
await db.update(users)
.set({ updatedAt: sql`NOW()` })
.where(eq(users.name, 'Dan'));
限制
PostgreSQL
MySQL
SQLite
SingleStore
使用 .limit()
向查询添加 limit
子句 - 例如
await db.update(usersTable).set({ verified: true }).limit(2);
update "users" set "verified" = $1 limit $2;
排序
使用 .orderBy()
向查询添加 order by
子句,按指定字段对结果进行排序
import { asc, desc } from 'drizzle-orm';
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name);
await db.update(usersTable).set({ verified: true }).orderBy(desc(usersTable.name));
// order by multiple fields
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name, usersTable.name2);
await db.update(usersTable).set({ verified: true }).orderBy(asc(usersTable.name), desc(usersTable.name2));
update "users" set "verified" = $1 order by "name";
update "users" set "verified" = $1 order by "name" desc;
update "users" set "verified" = $1 order by "name", "name2";
update "users" set "verified" = $1 order by "name" asc, "name2" desc;
带返回的更新
PostgreSQL
SQLite
MySQL
SingleStore
您可以在 PostgreSQL 和 SQLite 中更新一行并获取其返回
const updatedUserId: { updatedId: number }[] = await db.update(users)
.set({ name: 'Mr. Dan' })
.where(eq(users.name, 'Dan'))
.returning({ updatedId: users.id });
WITH UPDATE
子句
使用 with
子句可以通过将复杂查询拆分为称为公共表表达式 (CTE) 的更小查询来帮助您简化查询。
const averagePrice = db.$with('average_price').as(
db.select({ value: sql`avg(${products.price})`.as('value') }).from(products)
);
const result = await db.with(averagePrice)
.update(products)
.set({
cheap: true
})
.where(lt(products.price, sql`(select * from ${averagePrice})`))
.returning({
id: products.id
});
with "average_price" as (select avg("price") as "value" from "products")
update "products" set "cheap" = $1
where "products"."price" < (select * from "average_price")
returning "id"
UPDATE … FROM
PostgreSQL
MySQL
SQLite
SingleStore
正如 SQLite 文档中所述
UPDATE-FROM 概念是 SQL 的一个扩展,它允许 UPDATE 语句由数据库中的其他表驱动。“目标”表是要更新的特定表。使用 UPDATE-FROM,您可以将目标表与数据库中的其他表连接起来,以帮助计算哪些行需要更新以及这些行的新值应该是什么
同样,PostgreSQL 文档指出
一个表表达式,允许来自其他表的列出现在 WHERE 条件和更新表达式中
Drizzle 也支持此功能,从版本 [email protected]
开始
await db
.update(users)
.set({ cityId: cities.id })
.from(cities)
.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))
update "users" set "city_id" = "cities"."id"
from "cities"
where ("cities"."name" = $1 and "users"."name" = $2)
-- params: [ 'Seattle', 'John' ]
您还可以为连接的表设置别名(在 PG 中,您也可以为更新表设置别名)。
const c = alias(cities, 'c');
await db
.update(users)
.set({ cityId: c.id })
.from(c);
update "users" set "city_id" = "c"."id"
from "cities" "c"
PostgreSQL
MySQL
SQLite
SingleStore
在 Postgres 中,您还可以返回来自连接表的列。
const updatedUsers = await db
.update(users)
.set({ cityId: cities.id })
.from(cities)
.returning({ id: users.id, cityName: cities.name });
update "users" set "city_id" = "cities"."id"
from "cities"
returning "users"."id", "cities"."name"