如何在我的sql

时间:2017-07-21 12:32:17

标签: javascript mysql node.js

我有一张桌子

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

所以目前我有两个命令来执行此操作我们如何将其限制为一个命令,因为它们基本上都是更新单个表。

任何想法

4 个答案:

答案 0 :(得分:0)

同意@ 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
]);

答案 1 :(得分:0)

美好的一天,

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

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

答案 2 :(得分:0)

最佳实践之一是利用mysql的触发器。这些是完成工作的可编程数据库对象。 你基本上描述的是一个AFTER UPDATE触发器。例如:

CREATE TRIGGER doTheJob AFTER UPDATE ON accountdetails
FOR EACH ROW

BEGIN
UPDATE accountdetails
SET balance = +? WHERE accountid = ?

  END;
  DELIMITER ;

有关AFTER UPDATE触发器here的详细信息 有关触发器的更多信息here

答案 3 :(得分:0)

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

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