1

基本的に、プッシュアップ、プルアップ、および 3 マイルのランニングのスコアを追加して、300challenge テーブルのスコアを更新するトリガーを作成しようとしました。3 マイル ランのスコアは、下の大きな部分にSELECTあります。

create trigger update_wscore
AFTER INSERT
ON 300challenge FOR EACH ROW

Create table temp(3mile_score integer);
insert into temp(3mile_score) 
select 
  case 
    WHEN TIMEDIFF (3mile , '00:18:00') > '00:00:10' 
      THEN
         CASE 
            WHEN
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (3mile, '00:18:00')) / 10)) < 0
            THEN 0
         ELSE 
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (3mile, '00:18:00')) / 10))
         END
  ELSE 100
END
FROM 300challenge
WHERE wscore IS NULL;

UPDATE 300challenge
SET wscore = pushups * 2 + pullups * 5 + (select * from temp);

drop table temp;

をステートメントでSELECT直接使用しようとしましたが、ステートメント内の句でテーブルを使用できないと言ってうまくいきませんでした。UPDATE wscoreselect * fom temp300challengeSELECT FROMUPDATE

その後、現在上に表示されているものを試して、スコアをダンプする一時テーブルを作成し、スコアで使用するためにそれを読み取りましたUPDATE

しかし、明らかに、この方法はシステムをだますのに十分ではなく、次のエラーがスローされるようになりました。Explicit or implicit commit is not allowed in stored function or trigger.

アイデアが尽きてしまったので、何か提案があれば大歓迎です。

アップデート:

また、トリガーから を削除しCREATE TABLE TEMP、トリガーの外側にテーブルを作成し (1 回)、トリガーの最後の行を に置き換えてみましdrop table temptruncate table tempが、明らかに私の Web ホストはトリガーを許可していません。 TRIGGER command denied to user '--'@'localhost' for table '300challenge'

私のコードは今これです

CREATE TABLE TEMP (3mile_score INT);

CREATE TRIGGER update_wscore
AFTER INSERT ON 300 challenge
FOR EACH ROW

INSERT INTO TEMP (3mile_score)
SELECT CASE 
    WHEN TIMEDIFF(3mile, '00:18:00') > '00:00:10'
      THEN CASE 
          WHEN 100 - (EXTRACT(MINUTE FROM TIMEDIFF(3mile, '00:18:00')) * 6 +
               FLOOR(EXTRACT(SECOND FROM TIMEDIFF(3mile, '00:18:00')) / 10)) < 0
            THEN 0
          ELSE 100 - (EXTRACT(MINUTE FROM TIMEDIFF(3mile, '00:18:00')) * 6 +
               FLOOR(EXTRACT(SECOND FROM TIMEDIFF(3mile, '00:18:00')) / 10))
          END
    ELSE 100
    END
FROM 300 challenge
WHERE wscore IS NULL;

UPDATE 300 challenge
SET wscore = pushups * 2 + pullups * 5 + (
    SELECT *
    FROM TEMP
    );

TRUNCATE TABLE TEMP;
4

2 に答える 2

1

before insertこれをトリガーとして言い換えて、newレコードの値を変更してみてください。

トリガーの内部は次のようになります。

SET new.wscore = old.pushups * 2 + old.pullups * 5 +
    case 
    WHEN TIMEDIFF (old.3mile , '00:18:00') > '00:00:10' 
      THEN
         CASE 
            WHEN
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (old.3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (old.3mile, '00:18:00')) / 10)) < 0
            THEN 0
         ELSE 
              100 - (EXTRACT(MINUTE FROM TIMEDIFF (old.3mile, '00:18:00')) * 6 +
              FLOOR(EXTRACT(SECOND FROM TIMEDIFF (old.3mile, '00:18:00')) / 10))
         END
  ELSE 100
END;
于 2013-08-10T17:34:58.113 に答える