LINUX.ORG.RU

Триггер MySQL && WorkBench Settings


0

1

Помогите разобраться, пишу в WorkBench'е триггер для пересчёта «кармы» пользователя при голосовании другого за него. Он мне выделяет красным цветом, мол неправильно, но не пишет, что именно.

Есть такие таблицы:

CREATE  TABLE IF NOT EXISTS `projectxdb`.`users` (
  `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `karma` INT NOT NULL DEFAULT 0 ,
  PRIMARY KEY (`user_id`) )
ENGINE = InnoDB;


CREATE  TABLE IF NOT EXISTS `projectxdb`.`user_karmas` (
  `users_user_id` INT UNSIGNED NOT NULL ,
  `users_user_vote_receiver_id` INT UNSIGNED NOT NULL ,
  `karma_vote` INT(1) NULL DEFAULT 0 ,
  PRIMARY KEY (`users_user_id`, `users_user_vote_receiver_id`) ,
ENGINE = InnoDB;

Так как в mysql нет функции LAST() и в таблице user_karmas у меня нету id, триггер становится более интересным:

DELIMITER |

/*0*/CREATE TRIGGER `recalc_karma` AFTER INSERT ON `user_karmas`
/*1*/FOR EACH ROW BEGIN
/*2*/	UPDATE users SET karma=
/*3*/		(SELECT AVG(karma_vote) FROM user_karmas WHERE users_user_vote_receiver_id=/*считаем среднюю карму*/
/*4*/			(SELECT users_user_vote_receiver_id FROM user_karmas LIMIT ((SELECT COUNT(*) FROM user_karmas)-1), 1 as karma_receiver_id)/*для последнего добавленного юзера в таблице user_karmas*/
/*5*/			)
/*6*/		) WHERE user_id=karma_receiver_id; /*и ставим ему новую среднюю карму*/
/*7*/END;

Ругается на 4 строку.

Вопрос 1: Как заставить WorkBench показывать текст ошибки?
Вопрос 2: Что тут не правильно?

Здесь, пожалуй, нужно пояснить, что LIMIT ((SELECT COUNT(*) FROM user_karmas)-1), 1 должен выбрать предпоследний элемент в таблице и вывести один элемен после него т.е как раз последний.

anonymous327
() автор топика

Использовать переменные в LIMIT нельзя, задача разрешима только через prepare statement

anonymous327
() автор топика

Мне становится страшно от такого использования MySQL!

Вы, прежде чем открывать такой проект, попробуйте ему дать тестовую нагрузку... Не знаю, GET-запросами какими-нибудь. И посмотрите в mtop на его поведение.

valich ★★★
()

ИМХО такие штуки нужно по ночам пересчитывать, когда нагрузки нету по крону.

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.