Mysql触发数学计算

标签 mysql

有两个表:'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/

相关文章:

php - 检查查询中的值是否不在另一个表中

mysql - 将数据从oracle迁移到mysql

java - 使用 MySql 在 Java 中实现谷歌云消息传递

PHP-laravel : How to handle time overlapping in database?

mysql - 如何阻止 GORM 按 ID 对我的预加载进行排序?

php - 在 www 文件夹中提供下载链接是否安全

php - 将结果行的列作为数组返回,可以通过 codeigniter/active record 中的索引引用

mysql - 表 (A) 与其自身的自然连接

MySQL DISTINCT 查询与 LEFT JOIN 通过主键选择重复行

java - Spring和Hibernate项目每天抛出JDBC异常