2016-07-19 5 views
1

Существует две таблицы: «ответы» и «сообщения», и этот триггер помещается в таблицу «ответы».Расчет вычисления триггера Mysql

Каждый раз, когда новая запись помещается в таблицу ответов, триггер проверяет, соответствуют ли определенные условия для значений в строке в таблице сообщений с идентификатором соответствия в качестве новой записи.

Вот то, что я до сих пор:

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» является сокращением для «ответить», он сохраняет идентификатор поста ответ направлен на. SQLFiddle говорит, что ошибка в строке 4, где я пытаюсь сделать арифметическую операцию с SELECT COUNT(r_To) по модулю 10.

Невозможно создать SQLFiddle, это не спасёт мою схему, если это неверно.

+0

r_To это имя столбца или псевдоним? – scaisEdge

+0

имя столбца в таблице ответов – Lolechi

ответ

1

Два вопроса здесь! Во-первых, вам нужно изменить свой разделитель, чтобы определить свой триггер.

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, так что вы не сможете создать скрипку таким образом. Я не знаю, как работать с 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, поэтому вам придется придумать для этого подходящие условия.

+0

Я все еще получаю ту же ошибку в строке оператора IF. Я думаю, что это связано либо с «WHERE p_Id = NEW.r_To», либо с арифметическим вычислением – Lolechi

+0

обновил ответ, я думаю, что мы можем просто сделать запрос совсем немного. – e4c5

+0

Я заново рассмотрю расчет модуля. Там все еще есть ошибка: 'WHERE posts.p_Bump <5 ...;' вызывает это. Я просмотрел документацию, и это законно. Не знаете почему? – Lolechi

1

Я думаю, что по модулю должно быть сделано внутри подвыборки

BEGIN 
    IF posts.p_Bump < 5 
     WHERE posts.p_Id = NEW.r_To 
     AND (SELECT COUNT(r_To)%10 
       FROM replies WHERE r_To = NEW.r_To) = 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; 
+0

Смотрите мой комментарий под ответом e4c5. Я беспокоюсь, что оператор SELECT не возвращает значение, поэтому его нельзя сравнивать с возвратом bool? Проверяет, соответствует ли это 10 действительным синтаксисам? – Lolechi

+0

Вы можете проверить ifnull и убедиться, что в этом случае верните правильное значение .. – scaisEdge

Смежные вопросы