SQL 更新

传递给 .set() 的所有值都会自动参数化。 例如,这个查询:

await db.update(users).set({ name: "Mr. Dan" }).where(eq(users.name, "Dan"));

将会被翻译为:

update [users] set [name] = @par0 where [users].[name] = @par1; -- params: ['Mr. Dan', 'Dan']

你传递给 update 的对象应当包含与数据库 schema 中列名匹配的键。 对象中值为 undefined 的项会被忽略:如果要将某一列设为 null,请传入 null

await db.update(users)
  .set({ name: 'Mr. Dan' })
  .where(eq(users.name, 'Dan'));
await db.update(users)
  .set({ name: null })
  .where(eq(users.name, 'Dan'));

你可以将 SQL 作为值传递到更新对象中,像这样:

await db.update(users)
  .set({ updatedAt: sql`NOW()` })
  .where(eq(users.name, 'Dan'));

输出

此方法允许你返回查询所影响行中的值。MSSQL 支持返回插入的(新行值)和删除的(旧行值)值。

如果未指定任何字段,默认会返回所有插入值。

// 更新 cars 并返回所有新值
const updatedCars: Car[] = await db.update(cars)
  .set({ color: 'red' })
  .output()
  .where(eq(cars.color, 'green'));

// 更新 cars 并返回所有新值
const updatedCars: Car[] = await db.update(cars)
  .set({ color: 'red' })
  .output({ inserted: true })
  .where(eq(cars.color, 'green'));

// 更新 cars 并返回所有旧值
const updatedCarsIds: { deleted: Car }[] = await db.update(cars)
  .set({ color: 'red' })
  .output({ deleted: true })
  .where(eq(cars.color, 'green'));

// 更新 cars 并返回部分旧值和新值
const beforeAndAfter: { deleted: { oldColor: string }, inserted: { newColor: string } }[] = await db.update(cars)
  .set({ color: 'red' })
  .output({
    deleted: { oldColor: cars.color },
    inserted: { newColor: cars.color }
  })
  .where(eq(cars.color, 'green'));
update [cars] set [color] = 'red' output INSERTED.[name], INSERTED.[color] where [cars].[color] = 'green';
update [cars] set [color] = 'red' output INSERTED.[name], INSERTED.[color] where [cars].[color] = 'green';
update [cars] set [color] = 'red' output DELETED.[name], DELETED.[color] where [cars].[color] = 'green';
update [cars] set [color] = 'red' output INSERTED.[color], DELETED.[color] where [cars].[color] = 'green';