2

私がやろうとしているのは、スポーツ アプリケーション (特にサッカー) 用の Web アプリケーションを構築することです。現在、試合のスコアが記録された後に順位を更新するはずのトリガーに問題があります。この例では、「ゲーム」テーブルと「順位」テーブルがあります。

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)

ここで、h/atid (および tid)、fid、sid、および lid は、それぞれチーム、フィールド、シーズン、およびリーグ テーブルへの外部キーです。

ゲームのアップデート後にトリガーを作成したい。私がこのアプリケーションで目指している現在の設計は、「ゲーム」が挿入された時点でまだ「プレイ」されておらず、更新された時点でスコアが記録され、ゲームが「プレイ済み」と見なされるというものです。トリガーのセクションは次のとおりです。

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 を使用して、1 つの更新クエリで 2 つの更新クエリを実行できることを理解しています。基本的に、トリガーのこのスニペットでは、以前の更新を元に戻しています。その後、実際に残りの更新を実行するコードがさらにあります。私はトリガーにかなり慣れていないので、いつでも助けていただければ幸いです。

4

2 に答える 2

0

ドキュメントによると、MySQL の IF ブロック ターミネータは次の 2 つの単語ですEND IF

于 2013-10-11T05:24:20.703 に答える