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

我有一张桌子

accountdetails 

与领域

 customerid,balance,account id 

现在我试图更新这通过我的节点应用程序,当我转移金额,在一个logging的价值应该被扣除,在另一个它应该被记入

 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]') 

所以目前我有两个命令来做到这一点,我们怎么能限制这一个命令,因为基本上都是更新单表。

任何想法

Solutions Collecting From Web of "如何使用一个命令在我的sql中更新单个表中的两行"

同意@ kawadhiya21,也许最好不要这样做…你必须基准两种情况下找出performance,但一般来说,这是可能的:

 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 ]); 

最好的做法之一是使用MySQL的触发器。 这些是可编程的数据库对象来完成这项工作。 你基本上描述的是一个AFTER UPDATE触发器。 例如:


 CREATE TRIGGER doTheJob AFTER UPDATE ON accountdetails FOR EACH ROW BEGIN UPDATE accountdetails SET balance = +? WHERE accountid = ? END; DELIMITER ; 

更多的信息在这里 AFTER更新触发更多信息在这里触发器

另一种方法是使用存储过程来完成此操作: https : //dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html

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

美好的一天,

是的,这两个命令必须保持更新你的数据,因为你的命令有不同的条件。

您的第一个命令条件是WHERE customerid ,而另一个命令条件是WHERE accountid ,所以不可能将它们组合成一个单一的命令。