我想从Node.js应用程序更新SQLite表中的数据。
假设我有一个包含3列的“物”表:“ id”,“ code”和“ name”。
因此,我创建了一条明确的PUT路由,在其中构建了一个UPDATE SQL语句,并使用了从已解析主体中提取的一些变量。
app.put("/:id",function (req, res, next) {
db.run("UPDATE things SET code=?, name=? WHERE id=?",
[req.body.code,req.body.name,req.params.id],
function(err) {
...
})
}
我可以用put动词更新表
curl --header 'Content-Type: application/json' \
--request PUT \
--data '{"code":"ALC","name":"Alice"}' \
http://localhost:3000/1
到目前为止,很好。
但是,在某些情况下,我只想更新该行的一列,而保留所有其他列不变。我希望我的用户能够仅通过
来调用我的界面curl --header 'Content-Type: application/json' \
--request PUT \
--data '{"name":"Anna"}' \
http://localhost:3000/1
但是,此操作的结果是将“代码”列设置为NULL,而不是保持不变。
是否可以编写一个可以产生此结果的UPDATE语句?还是我需要动态构建不同的UPDATE语句?
在示例中,将取决于我是否要修改一个,另一个或两个列?但是在现实世界中,如果有超过20个可能的更新列,它将变得非常不便。
答案 0 :(得分:0)
如果为该列提供的参数为COALESCE
,请尝试使用NULL
函数将该列设置为其当前值。除了参数名称外,这是ISO SQL标准的东西。我不知道您使用的是哪种RDBMS,但是我假设它支持命名参数(所有现代RDBMS数据库都支持命名参数,但是使用它们自己的不同语法)
UPDATE
foo
SET
Col1 = COALESCE( @param1, Col1 ),
Col2 = COALESCE( @param2, Col2 ),
Col3 = COALESCE( @param3, Col3 )
WHERE
PrimaryKeyCol = @primaryKey