2017-03-05 15 views
2

私はそれに多くの時間を費やしましたが、それでも解決できません。MySQLでトリガーが間違っているのはなぜですか?

いくつかの理由で私はデータベースにいくつかの同じ挿入を防止したい。だから、私はトリガを使用することを選択します。つまり、

CREATE TRIGGER trigger_card_usage_insert_block 
    BEFORE INSERT ON annual_card_usage_log 
    FOR EACH ROW 
    BEGIN 

    DECLARE lasttime INT; -- hold the last insert time 

    SELECT 
     usage_time INTO lasttime 
    FROM 
     annual_card_usage_log 
    WHERE 
     NEW.card_id = card_id 
    AND NEW.mch_id = mch_id 
    AND NEW.store_id = store_id 
    ORDER BY 
     usage_time DESC 
    LIMIT 1; 

    -- only insert when after 300 second 
    IF(
     lasttime != NULL 
     AND(lasttime + 300 < new.usagetime) 
    ) THEN 
     INSERT INTO annual_card_usage_log(
      card_id , 
      mch_id , 
      store_id , 
      usage_time 
     ) 
    VALUES 
     (
      NEW.card_id , 
      NEW.mch_id , 
      NEW.store_id , 
      NEW.usage_time 
     ); 
    END 
    IF; 

    END$ 

これは作成コードです。そして、以下はテーブル、

CREATE TABLE `annual_card_usage_log` (
     `usage_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', 
     `card_id` int(10) unsigned NOT NULL COMMENT '', 
     `mch_id` int(10) unsigned NOT NULL COMMENT '', 
     `store_id` int(10) DEFAULT NULL, 
     `usage_time` int(10) NOT NULL COMMENT '', 
     PRIMARY KEY (`usage_id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

私はトリガーを作成することはできません、それは間違っているようです。なぜか教えてくれますか?どのコードが間違っているか。

私はSequel Proという名前のMySQLクライアントを使用していますが、SQLを実行するとエラーメッセージが表示されます。「SQL構文にエラーがあります。使用する正しいMySQLサーバーバージョンに対応するマニュアルを確認してください。近くの ''行6で実行が停止しました!」私は今や理由はありません。

+0

*トリガーを作成できません。* - 正確にはなぜですか? – anatol

+0

@anatol Sequel Proと呼ばれるmysqlクライアントを使用しています.SQLを実行すると、「SQL構文にエラーがあります。近い構文を使用するためにはMySQLサーバーのバージョンに対応するマニュアルをチェックしてください'' at line 6 実行が停止しました! "私は今や理由はありません。 – blackdog

+0

それは役に立つ情報です、あなたの質問に追加してください – anatol

答えて

1

@anatolのおかげで私はそれを解決しました。私は道を変えた。値を無効なデータに設定しました。次に、無効なデータを削除するジョブを作成します。

トリガーは、@anatolのような無限ループを引き起こすため、同じテーブルに挿入できません。

DELIMITER $$ 
    CREATE TRIGGER triger_card_usage_insert_block BEFORE INSERT ON annual_card_usage_log FOR EACH ROW 
    BEGIN 

    DECLARE lasttime INT(10) ; 
    SET lasttime =(
     SELECT 
      usage_time 
     FROM 
      annual_card_usage_log 
     WHERE 
      NEW.card_id = card_id 
     AND NEW.mch_id = mch_id 
     AND NEW.store_id = store_id 
     ORDER BY 
      usage_time DESC 
     LIMIT 1 
    ) ; 
    IF (lasttime + 300 > new.usage_time) THEN 
    SET new.new_card_id = new.card_id; 
    SET new.card_id = 0 ; 
    END 
    IF ; 
    END$$ 
    DELIMITER ; 
関連する問題