MySQL 在 UPDATE 时使用 IF 语句触发
MySQL Trigger with IF statement on UPDATE
我想创建一个触发器。
这是我的两个 table,
kk_settlements
table
| paidBy | paidTo | settlementAmount | createdAt | groupId |
kk_user_relations
table
| userId | userId_1 | groupId | amount |
现在当 kk_settlements
上有一个 INSERT
我想创建触发器和 UPDATE
kk_user_relations
table.
在执行 UPDATE
之前,我想检查 paidBy
是小于还是大于 paidTo
,并根据它找到 kk_user_relations
中的行 table 这是要更新的。 (因为 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
我哪里错了?我想我在触发器中使用 paidBy
和 paidTo
时出错了。请指正。
还建议是否有更好的方法来完成同样的事情。我愿意接受建议。
试试 NEW.paidBy 和 NEW.paidTo。
这就是您引用 FOR EACH ROW 当前行值的方式。在 UPDATE 触发器中,您可以使用 OLD 和 NEW 来引用字段的前一个值和它正在更改的值。
我想创建一个触发器。
这是我的两个 table,
kk_settlements
table| paidBy | paidTo | settlementAmount | createdAt | groupId |
kk_user_relations
table| userId | userId_1 | groupId | amount |
现在当 kk_settlements
上有一个 INSERT
我想创建触发器和 UPDATE
kk_user_relations
table.
在执行 UPDATE
之前,我想检查 paidBy
是小于还是大于 paidTo
,并根据它找到 kk_user_relations
中的行 table 这是要更新的。 (因为 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
我哪里错了?我想我在触发器中使用 paidBy
和 paidTo
时出错了。请指正。
还建议是否有更好的方法来完成同样的事情。我愿意接受建议。
试试 NEW.paidBy 和 NEW.paidTo。
这就是您引用 FOR EACH ROW 当前行值的方式。在 UPDATE 触发器中,您可以使用 OLD 和 NEW 来引用字段的前一个值和它正在更改的值。