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将进行一次折腾。逐一更新。设想行上有多个加减运算。