需要前一个事件的字段的 MySQL 触发器

标签 mysql sql triggers

我还有一个触发问题,在我解释之前,我要给你看一个代码:

DELIMITER $$

CREATE PROCEDURE transferFunds ( receiver INT, sender INT, amount FLOAT )

BEGIN

  DECLARE senderBalance FLOAT;
  DECLARE receiverBalance FLOAT;

  SELECT balance INTO senderBalance 
    FROM accounts 
   WHERE accountNumber = sender;

  SELECT balance INTO receiverBalance 
    FROM accounts 
   WHERE accountNumber = receiver;

  SET autocommit = 0;

  UPDATE accounts
     SET balance = senderBalance - amount
   WHERE accountNumber = sender;

  UPDATE accounts
     SET balance = receiverBalance + amount
   WHERE accountNumber = receiver;

  IF senderBalance < amount THEN
    ROLLBACK;
  ELSE
    COMMIT;
  END IF;

END$$

CREATE TRIGGER transferTrigger AFTER UPDATE ON accounts
FOR EACH ROW
BEGIN

  -- Insert the Receiver and Sender and Amount to transfer_log table

END$$

我想创建一个触发器来记录刚刚发生的传输,但我做不到,因为触发器在每行事件中工作。如果我想在 transfer_log 表中记录转账事件并插入收件人和发件人帐号以及转账金额,我该怎么做?

最佳答案

正如您在问题中所述,触发器按行工作。

您应该直接在存储过程中进行日志记录。但是,您可以使用变通方法,但我认为它不安全 - 特别是在处理货币交易时(如 OP 所示)。

在你的存储过程中:

SET @TranSender = sender;
SET @TranReceiver = receiver;
...

在你的触发器中:

INSERT log_table(Sender, Receiver...)
VALUES (@TranSender , @TranReceiver...)

关于需要前一个事件的字段的 MySQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057725/

相关文章:

php - 提交按钮不起作用 - if else 语句

mysql - 出现 1045 错误时,如何在 SQL 中导出运行查询的结果?

php - 在单个查询中将结果作为单个数组获取

ORACLE 和 TRIGGERS(插入、更新、删除)

sql - 必须相互更新的两个表的触发器替代方案

mysql - 如何找到数字范围内的差距?

PHP传递mysql查询结果显示在另一个页面

MySQL 存储过程将参数输入与表值进行比较

MySQL GROUP BY "and filter"

github - 如何从 GitHub 评论为我的拉取请求触发 Travis 重建?