使用 Knex.js 在单个查询中更新多行数据(批量更新)在 Microsoft SQL Server 中可以通过多种方式实现。以下是一些常见的方法:
CASE
语句你可以使用 CASE
语句来构建一个复杂的 SQL 更新查询。以下是一个示例,演示如何使用 Knex.js 来实现这一点。
假设我们有一个名为 users
的表,其中包含 id
和 name
列。我们希望在单个查询中更新多个用户的名称。
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');
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
语句来更新目标表。
同上。
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();
领取专属 10元无门槛券
手把手带您无忧上云