Javascript 如何在我的sql中用一个命令更新一个表中的两行

Javascript 如何在我的sql中用一个命令更新一个表中的两行,javascript,mysql,node.js,Javascript,Mysql,Node.js,我有一张桌子 accountdetails 有田地 customerid,balance,account id 现在我正试图通过我的节点应用程序更新这个,当我转移金额时,在一条记录中,该值应记入借方,在另一条记录中,该值应记入贷方 var data = {customerid,transferamount,accountid}; con.query('update accountdetails set balance = balance-? WHERE customerid = ?

我有一张桌子

 accountdetails
有田地

customerid,balance,account id
现在我正试图通过我的节点应用程序更新这个,当我转移金额时,在一条记录中,该值应记入借方,在另一条记录中,该值应记入贷方

var data = {customerid,transferamount,accountid};


 con.query('update accountdetails set balance = balance-? WHERE customerid = ? ,
 [data.transferamount,data.customerid]')

con.query('update  accountdetails set balance = balance+? WHERE accountid = ?,
[data.transferamount,data.accountid]')
所以目前我有两个命令来做这件事,我们怎么能把它限制为一个命令,因为这两个命令基本上都是在更新单个表


任何想法

都同意@kawadhiya21,也许最好不要这么做。。。您必须对这两种情况进行基准测试,以确定性能,但一般来说,这是可能的:

sql = 'update accountdetails';
sql += 'set balance = if(customerid = ?, balance - ?, if(accountid = ?, balance + ?, balance) ) ';
sql += 'where customerid = ? or accountid = ?';
con.query(sql, [
    data.customerid,
    data.transferamount,
    data.accountid,
    data.transferamount,
    data.customerid,
    data.accountid
]);

同意@kawadhiya21,也许最好不要这么做。。。您必须对这两种情况进行基准测试,以确定性能,但一般来说,这是可能的:

sql = 'update accountdetails';
sql += 'set balance = if(customerid = ?, balance - ?, if(accountid = ?, balance + ?, balance) ) ';
sql += 'where customerid = ? or accountid = ?';
con.query(sql, [
    data.customerid,
    data.transferamount,
    data.accountid,
    data.transferamount,
    data.customerid,
    data.accountid
]);
你好

是的,这两个命令必须保留以更新数据,因为您的命令具有不同的条件

您的第一个命令条件是
WHERE customerid
,而另一个命令条件是
WHERE accountid
,因此无法将这些条件组合到一个命令中。

祝您好运

是的,这两个命令必须保留以更新数据,因为您的命令具有不同的条件


您的第一个命令条件是
WHERE customerid
,而另一个命令条件是
WHERE accountid
,因此不可能将它们组合到一个命令中。

最佳实践之一是使用mysql的触发器。这些是执行此任务的可编程数据库对象。 您基本上描述的是更新后触发器。例如:



有关更新后触发器的详细信息
关于触发器的更多信息

最佳实践之一是利用mysql的触发器。这些是执行此任务的可编程数据库对象。 您基本上描述的是更新后触发器。例如:



有关更新后触发器的详细信息
有关触发器的更多信息另一种方法是使用存储过程来完成此操作:


使用存储过程,您可以添加3个参数(customerid、transferamount、accountid)并隐藏SQL调用的所有内部详细信息(例如来自Vladimir Kovpak的解决方案)

另一种方法是使用存储过程来实现这一点:


使用存储过程,您可以添加3个参数(customerid、transferamount、accountid)并隐藏SQL调用的所有内部细节(例如来自Vladimir Kovpak的解决方案)

我认为您不应该这样做。由于where子句是完全不同的,所以两个查询都很好。为了减少使用的rest调用的数量,我想将其改为单命令。请看这篇文章:dude atomicity将进行一次折腾。逐一更新。想象一下,行上有多个加减运算。我认为你不应该这样做。由于where子句是完全不同的,所以两个查询都很好。为了减少使用的rest调用的数量,我想将其改为单命令。请看这篇文章:dude atomicity将进行一次折腾。逐一更新。设想行上有多个加减运算。