我必须在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中吗? 或者还有其他方法可以解决这个问题吗?感谢。
答案 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"]);
)设置为您想要的任何内容。