2013-10-11 2 views
2

Так что я пытаюсь создать веб-приложение для спортивных приложений (в частности, для футбола). Прямо сейчас у меня возникают проблемы с триггером, который должен обновить турнирную таблицу после того, как будет засчитан счет матча. В этом примере у меня есть таблица «игр» и таблица «таблицы», например.ОШИБКА 1054 (42S22) на триггере

mysql> describe game; 
+-----------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+------------+------+-----+---------+-------+ 
| sid    | int(11) | NO | PRI | NULL |  | 
| fid    | int(11) | NO | PRI | NULL |  | 
| lid    | int(11) | NO | PRI | NULL |  | 
| htid   | int(11) | NO | PRI | NULL |  | 
| atid   | int(11) | NO | PRI | NULL |  | 
| date   | date  | NO |  | NULL |  | 
| time   | time  | NO |  | NULL |  | 
| h_g    | int(11) | NO |  | 0  |  | 
| a_g    | int(11) | NO |  | 0  |  | 
| has_been_played | tinyint(1) | NO |  | 0  |  | 
+-----------------+------------+------+-----+---------+-------+ 
10 rows in set (0.00 sec) 

mysql> describe standings; 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| tid | int(11) | NO | PRI | NULL |  | 
| sid | int(11) | NO | PRI | NULL |  | 
| lid | int(11) | NO | PRI | NULL |  | 
| pld | int(11) | NO |  | 0  |  | 
| pts | int(11) | NO |  | 0  |  | 
| h_w | int(11) | NO |  | 0  |  | 
| h_t | int(11) | NO |  | 0  |  | 
| h_l | int(11) | NO |  | 0  |  | 
| h_gf | int(11) | NO |  | 0  |  | 
| h_ga | int(11) | NO |  | 0  |  | 
| a_w | int(11) | NO |  | 0  |  | 
| a_t | int(11) | NO |  | 0  |  | 
| a_l | int(11) | NO |  | 0  |  | 
| a_gf | int(11) | NO |  | 0  |  | 
| a_ga | int(11) | NO |  | 0  |  | 
+-------+---------+------+-----+---------+-------+ 
15 rows in set (0.00 sec) 

Где ч/Atid (и TID), груда, с.и.д., и крышка имеют внешние ключи для команды, поля, сезон и таблицы лиги, соответственно.

Я хочу создать триггер после обновления игры. Текущий дизайн, на который я нацелен в этом приложении, заключается в том, что когда вставлена ​​«игра», она еще не «сыграна», а когда она обновляется, то счет записывается, а затем игра считается «играемой». Итак, вот раздел триггера:

CREATE TRIGGER `update_standing` AFTER UPDATE ON `game` 
FOR EACH ROW 
BEGIN 
    # If a score has been recorded already, we'll reverse the old score 
    # before updating the new score. 
    IF OLD.has_been_played THEN 
    # The Home Team previously recorded a win 
    IF OLD.h_g > OLD.a_g THEN 
     # Home win 
     UPDATE standings 
     SET pld = pld - 1, 
      h_w = h_w - 1, 
      pts = pts - 3, 
      h_gf = h_gf - OLD.h_g, 
      h_ga = h_ga - OLD.a_g 
     WHERE tid = OLD.htid 
     AND sid = OLD.sid 
     AND lid = OLD.lid; 

     # Away loss 
     UPDATE standings 
     SET pld = pld - 1, 
      a_l = a_l - 1, 
      a_gf = a_gf - OLD.a_g, 
      a_ga = a_ga - OLD.h_g 
     WHERE tid = OLD.atid 
     AND sid = OLD.sid 
     AND lid = OLD.lid; 
    ENDIF; 
    ENDIF; 
END; 

И почему-то я получаю эти ошибки, и я не знаю, почему.

mysql> source new_trigger_myfam.sql 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 18 
ERROR 1054 (42S22): Unknown column 'OLD.atid' in 'where clause' 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ENDIF' at line 1 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ENDIF' at line 1 
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END' at line 1 

Есть ли что-то явно с моим синтаксисом? Я понимаю, что я мог бы выполнить два запроса обновления в одном случае case/when/then. По сути, в этом фрагменте триггера я меняю предыдущее обновление, а затем появляется еще один код, делающий остальную часть обновления. Я довольно новичок в триггерах, поэтому помощь всегда ценится.

ответ

0

В соответствии с the documentation, терминатор IF блока в MySQL - это два слова: END IF.

+0

Странно, причина даже с концом, если эта линия все еще лает на меня. –

0

Так что я получил его с помощью кого-то другого.

Мне нужно обернуть разделитель вокруг триггеров, потому что первый экземпляр; означает, что весь триггер «закончился», когда, очевидно, это не то, что я хочу.

Действительно глупо, если вы спросите меня, но что вы можете сделать?

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