【问题标题】:MySQL Trigger with IF statement on UPDATEMySQL 触发器在 UPDATE 上使用 IF 语句
【发布时间】:2018-04-05 23:03:49
【问题描述】:

我想创建一个触发器。

这是我的两张桌子,

  1. kk_settlements

    | paidBy | paidTo | settlementAmount | createdAt | groupId |
    
  2. kk_user_relations

    | userId | userId_1 | groupId | amount |
    

现在当kk_settlements 上有一个INSERT 时,我想创建触发器和UPDATE kk_user_relations 表。

在执行UPDATE 之前,我想检查paidBy 是否小于或大于paidTo,并在此基础上找到kk_user_relations 表中要更新的行。 (由于kk_user_relations 中的所有行都由userId 存储userId_1

我尝试添加以下trigger(我使用的是phpmyadmin)

IF (paidBy < paidTo)
THEN
UPDATE kk_user_relations 
SET kk_user_relations.amount = kk_user_relations.amount + settlementAmount 
WHERE kk_user_relations.userId = paidBy 
AND kk_user_relations.userId_1 = paidTo 
AND kk_user_relations.groupId = groupId;
ELSE
UPDATE kk_user_relations 
SET kk_user_relations.amount = kk_user_relations.amount + settlementAmount 
WHERE kk_user_relations.userId_1 = paidBy
AND kk_user_relations.userId = paidTo 
AND kk_user_relations.groupId = groupId;
END IF

trigger 不起作用并引发错误。

#1054 - Unknown column 'paidBy' in 'field list'

phpmyadmin生成的完整trigger

DROP TRIGGER IF EXISTS `kk_update_user_relations`;
CREATE DEFINER=`root`@`localhost` TRIGGER `kk_update_user_relations`
AFTER INSERT ON `kk_settlements`
FOR EACH ROW 
IF (paidBy < paidTo) THEN 
UPDATE kk_user_relations 
SET kk_user_relations.amount = kk_user_relations.amount + settlementAmount 
WHERE kk_user_relations.userId = paidBy
AND kk_user_relations.userId_1 = paidTo 
AND kk_user_relations.groupId = groupId;
ELSE UPDATE kk_user_relations 
SET kk_user_relations.amount = kk_user_relations.amount + settlementAmount 
WHERE kk_user_relations.userId_1 = paidBy 
AND kk_user_relations.userId = paidTo 
AND kk_user_relations.groupId = groupId;
END IF 

我哪里错了?我想我在触发器中使用paidBypaidTo 时出错了。请纠正我。

还建议是否有更好的方法来完成同样的事情。我愿意接受建议。

【问题讨论】:

  • 试试NEW.paidByNEW.paidTo。这就是您引用FOR EACH ROW 当前行的值的方式;在 UPDATE 触发器中,您可以使用 OLDNEW 来引用字段的前一个值以及它正在更改为的值。
  • @Uueerdo 感谢您的快速回复!我用NEW 来引用paidBypaidTo 的值,现在可以了!非常感谢您的评论! :)

标签: mysql phpmyadmin


【解决方案1】:

试试 NEW.paidBy 和 NEW.paidTo。

这就是您引用 FOR EACH ROW 当前行的值的方式。在 UPDATE 触发器中,您可以使用 OLD 和 NEW 来引用字段的前一个值以及正在更改的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2020-09-12
    • 2019-06-12
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多