mysql - 在 INSERT 中减去/添加 MySQL 列的值

标签 mysql sql

假设我有 transfersbank_accounts 表。我希望运行以下查询:

INSERT INTO transfers SET amount = 1234, sender_account = 323, receiver_account = 324;

我想修改我的查询,这样它将增加 receiver_account 余额的转账金额,并减少 sender_account 的余额。这在 MySQL 中可能吗?

编辑
sender_accountreceiver_account 列是 bank_accounts 的外键。

最佳答案

有两种方法可以做到这一点。第二个是我最喜欢的,并且不太容易出错。

1) 如果这是在同一个函数/类(PHP、java 等)中运行,那么 amount、sender_account、receiver_account 的值都可以作为变量提供给您,那么您可以使用标准构建 MySQL更新声明:

UPDATE bank_accounts SET balance = balance + amount WHERE account_id = receiverAccount
UPDATE bank_accounts SET balance = balance - amount WHERE account_id = senderAccount

account_id 是bank_accounts 表的主键,receiverAccount/senderAccount 是包含这些值的变量。

2) 如果您在同一函数中无法获得这些值,那么您可以求助于使用触发器。

CREATE TRIGGER UpdateAccounts
AFTER INSERT ON transfers
BEGIN
UPDATE bank_accounts SET balance = balance + NEW.amount WHERE account_id = NEW.receiver_account
UPDATE bank_accounts SET balance = balance - NEW.amount WHERE account_id = NEW.senderAccount
END;

当不同的表发生多个更新并且您不想错过其中任何一个时,触发器会很有帮助。对于银行等项目来说非常方便。 您可以在此处阅读有关触发器及其使用方式的更多信息: https://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

关于mysql - 在 INSERT 中减去/添加 MySQL 列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650748/

相关文章:

mysql - 基于从另一个表中提取的数据的 SQL 批量插入

mysql - 左连接返回非所有行

PHP - 表单仅使用表单中的最后一行

php - MySQL 计算 INT UNSIGNED 上的负值

c# - 检查数据库中整数的空值

java - 最有效的多线程SQL方式(Java)

php - Laravel 4 (Eloquent) 无法识别 ('date' ,'<' ,'NOW()' ) - 完全忽略它

mysql - phpMyAdmin 没有正确计算行数

mysql - SQL 查询以查找上一个日期、当前日期和下一个日期

mysql - MySQL 中的 IF 语句