首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用knex在单个查询中更新多行数据MsSQL

使用 Knex.js 在单个查询中更新多行数据(批量更新)在 Microsoft SQL Server 中可以通过多种方式实现。以下是一些常见的方法:

方法一:使用 CASE 语句

你可以使用 CASE 语句来构建一个复杂的 SQL 更新查询。以下是一个示例,演示如何使用 Knex.js 来实现这一点。

假设我们有一个名为 users 的表,其中包含 idname 列。我们希望在单个查询中更新多个用户的名称。

示例数据

代码语言:javascript
复制
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(255)
);

INSERT INTO users (id, name) VALUES (1, 'Alice');
INSERT INTO users (id, name) VALUES (2, 'Bob');
INSERT INTO users (id, name) VALUES (3, 'Charlie');

Knex.js 代码

代码语言:javascript
复制
const knex = require('knex')({
  client: 'mssql',
  connection: {
    host: 'your_host',
    user: 'your_user',
    password: 'your_password',
    database: 'your_database'
  }
});

const updates = [
  { id: 1, name: 'Alice Updated' },
  { id: 2, name: 'Bob Updated' },
  { id: 3, name: 'Charlie Updated' }
];

const query = knex('users')
  .update({
    name: knex.raw(`CASE id ${updates.map(u => `WHEN ${u.id} THEN '${u.name}'`).join(' ')} END`)
  })
  .whereIn('id', updates.map(u => u.id))
  .toString();

console.log(query);

knex.raw(query)
  .then(() => {
    console.log('Update successful');
  })
  .catch(err => {
    console.error('Update failed', err);
  })
  .finally(() => {
    knex.destroy();
  });

方法二:使用临时表

另一种方法是使用临时表来存储更新数据,然后使用 JOIN 语句来更新目标表。

示例数据

同上。

Knex.js 代码

代码语言:javascript
复制
const knex = require('knex')({
  client: 'mssql',
  connection: {
    host: 'your_host',
    user: 'your_user',
    password: 'your_password',
    database: 'your_database'
  }
});

const updates = [
  { id: 1, name: 'Alice Updated' },
  { id: 2, name: 'Bob Updated' },
  { id: 3, name: 'Charlie Updated' }
];

async function updateUsers() {
  try {
    // 创建临时表
    await knex.schema.raw(`
      CREATE TABLE #TempUsers (
        id INT,
        name VARCHAR(255)
      )
    `);

    // 插入更新数据到临时表
    await knex('#TempUsers').insert(updates);

    // 使用 JOIN 语句更新目标表
    await knex('users')
      .join('#TempUsers', 'users.id', '=', '#TempUsers.id')
      .update({
        'users.name': knex.ref('#TempUsers.name')
      });

    console.log('Update successful');
  } catch (err) {
    console.error('Update failed', err);
  } finally {
    // 删除临时表
    await knex.schema.raw('DROP TABLE #TempUsers');
    knex.destroy();
  }
}

updateUsers();
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券