有两个表:'replies' 和 'posts',这个触发器放在 'replies' 表上。
每次在回复表中放置一个新条目时,触发器都会检查帖子表中具有匹配 ID 作为新条目的行中的值是否满足某些条件。
这是我目前所拥有的:
CREATE TABLE posts(
p_Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
p_Health INT UNSIGNED NOT NULL DEFAULT 0,
p_Bump INT UNSIGNED NOT NULL DEFAULT 0,
p_Time TIMESTAMP);
CREATE TABLE replies(
r_Id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
r_To INT UNSIGNED NOT NULL,
r_Time TIMESTAMP);
CREATE TRIGGER bump AFTER INSERT ON replies
FOR EACH ROW
BEGIN
IF posts.p_Bump < 5 WHERE posts.p_Id = NEW.r_To AND (SELECT COUNT(r_To) FROM replies WHERE r_To = NEW.r_To)%10 = 10 THEN
UPDATE posts
SET posts.p_Bump = posts.p_Bump + 1 AND
SET posts.p_Health = 0 WHERE posts.p_Id = NEW.r_To;
END IF;
END;
INSERT INTO posts() VALUES();
INSERT INTO replies(r_To) VALUES(1);
INSERT INTO replies(r_To) VALUES(1);
INSERT INTO posts() VALUES();
INSERT INTO replies(r_To) VALUES(2);
INSERT INTO replies(r_To) VALUES(2);
INSERT INTO replies(r_To) VALUES(2);
'r_To' 是“reply to”的简写,它存储了回复指向的帖子的 ID。
SQLFiddle 说第 4 行有一个错误,我尝试用 SELECT COUNT(r_To)
以 10 为模进行算术运算。
无法创建 SQLFiddle,如果它不正确,它不会保存我的模式。
最佳答案
这里有两个问题!首先是您需要更改定界符来定义触发器。
DELIMITER $$
CREATE TRIGGER bump AFTER INSERT ON replies
FOR EACH ROW
BEGIN
IF posts.p_Bump < 5 WHERE posts.p_Id = NEW.r_To AND (SELECT COUNT(r_To) FROM replies WHERE r_To = NEW.r_To)%10 = 10 THEN
UPDATE posts
SET posts.p_Bump = posts.p_Bump + 1 AND
SET posts.p_Health = 0 WHERE posts.p_Id = NEW.r_To;
END IF;
END;
DELIMITER ;
第二个是 sqlfiddle.com 不支持定界符命令,因此您将无法以这种方式创建 fiddle 。我不知道 sqlfiddle 的解决方法,但将其输入控制台应该可以解决问题。
不太确定这是否合法
IF posts.p_Bump < 5 WHERE posts.p_Id = NEW.r_To AND (SELECT COUNT(r_To) FROM replies WHERE r_To = NEW.r_To)%10 = 10 THEN
我想你将不得不做
SELECT COUNT(r_To) into @myvar FROM replies WHERE r_To = NEW.r_To;
IF @myvar %10 = 10 THEN
UPDATE posts
SET posts.p_Bump = posts.p_Bump + 1 AND
SET posts.p_Health = 0 WHERE posts.p_Bump < 5 AND posts.p_Id = NEW.r_To;
END IF;
这是一个简单得多的查询,我认为它符合您的预期。但是 someint % 10
永远不会是 10,它只能取 0 到 9 之间的值,因此您必须为此提出正确的条件。
关于Mysql触发数学计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38459275/