我有一张桌子
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]')
所以目前我有两个命令来执行此操作我们如何将其限制为一个命令,因为它们基本上都是更新单个表。
任何想法
答案 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 ;
答案 3 :(得分:0)
另一种方法是使用存储过程来完成此任务: https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-stored-procedures.html
使用存储过程,您可以添加3个参数(customerid,transferamount,accountid)并隐藏SQL调用的所有内部详细信息(例如Vladimir Kovpak的解决方案)