更新触发后如何避免MySQL错误1442?

时间:2014-06-01 18:20:53

标签: mysql sql

我必须在MySQL中构建一个简单的引用系统,而不是PHP。 当用户获得积分时,他的推荐人也必须自动获得该积分的10%,依此类推,而积分大于1。 例: 吉姆赚了20, 所以他的推荐人约翰获得了2, 所以他的推荐人Mark没有收入,因为他的部分是0.2

这是代码:

drop table if exists account;
create table test.account(
username char(100) PRIMARY KEY,
points int,
referrer char(100)
)ENGINE = InnoDB DEFAULT CHARACTER SET = latin1 COLLATE = latin1_general_cs;

drop trigger if exists updater;
DELIMITER //
CREATE TRIGGER updater AFTER UPDATE ON account FOR EACH ROW
BEGIN
SET @points_to_referrer=(NEW.points-OLD.points)*0.1;
IF(@points_to_referrer>1)THEN
    UPDATE account SET points=points+@points_to_referrer WHERE username=OLD.referrer;
END IF;
END //
DELIMITER ;

INSERT INTO `test`.`account` (`username`, `points`, `referrer`) VALUES ('john', '10', 'mark');
INSERT INTO `test`.`account` (`username`, `points`, `referrer`) VALUES ('mark', '10', 'jim');
INSERT INTO `test`.`account` (`username`, `points`, `referrer`) VALUES ('jim', '10', 'john');

......这是一个命令样本:

UPDATE `test`.`account` SET `points`='30' WHERE `username`='jim';

此命令会触发1442错误而不是更新,因为它似乎是一个无限循环。 我可以通过设置任何系统选项强制执行此代码,可能在my.ini中吗? 或者还有其他方法可以解决这个问题吗?感谢。

1 个答案:

答案 0 :(得分:0)

您无法更新调用触发器的表(帐户):

  

在存储的函数或触发器中,不允许修改a   已经被使用(用于读或写)的表   调用函数或触发器的语句。

这样做会产生错误1442:

BEFORE UPDATE ON

解决方案:如果您想要的是,要在更新前设置字段值,您可以使用NEW触发器并使用DROP TRIGGER IF EXISTS updater; DELIMITER // CREATE TRIGGER updater BEFORE UPDATE ON account FOR EACH ROW BEGIN SET @points_to_referrer=(NEW.points-OLD.points)*0.1; IF(@points_to_referrer > 1)THEN SET NEW.points = NEW.points + @points_to_referrer; END IF; END // DELIMITER ; 运算符来执行此操作:

BEFORE UPDATE/INSERT ON

您可以使用NEW.<field>设置字段值,因为它们尚未更新/插入。您需要做的就是将NEW.<field_name>(当前行的所有值都可以使用$email = isset($_POST["email"]); )设置为您想要的任何内容。