2016-07-24 2 views
1

BLUF:無効なデータが挿入されないように、後で検討するためにそのデータをエラーメッセージと共に別のテーブルに保存するために、before insertトリガーを使用します。 。トリガーに条件が存在する場合、MySQLテーブルにレコードを挿入する方法

ラズベリーパイ気象ステーションが気象データを記録しているテーブルがあります。時には、さまざまな理由でハードウェアに障害が発生することがあります。その場合、その特定のデータポイントで-1000が返されます。

これらのレコードが他の有効なデータとともにテーブルに書き込まれないようにするために、私はbefore insertトリガーを書き込もうとしました。この部分はうまくいくようでした。しかし、私はまた、これらの誤ったレコードを別のテーブルに書きたいと思います。テスト中は、不良データは期待通りに拒否されますが、エラーログテーブルには記録されません。ここで

は、私が書かれているトリガーである:ここでは

DROP TRIGGER IF EXISTS wx_beforeInsert; 

SET @ERROR_MESSAGE = ''; 

DELIMITER $$ 
CREATE TRIGGER `wx_beforeInsert` BEFORE INSERT ON WEATHER_MEASUREMENT 
FOR EACH ROW BEGIN 
    IF (NEW.AMBIENT_TEMPERATURE = '-1000') THEN 
     SET @ERROR_MESSAGE = "Ambient tempurature invalid. Record rejected."; 
    ELSEIF (NEW.GROUND_TEMPERATURE = '-1000') THEN 
     SET @ERROR_MESSAGE = "Ground tempurature invalid. Record rejected."; 
    ELSEIF (NEW.AIR_QUALITY = '-1000') THEN 
     SET @ERROR_MESSAGE = "Air quality invalid. Record rejected."; 
    ELSEIF (NEW.AIR_PRESSURE = '-1000') THEN 
     SET @ERROR_MESSAGE = "Air pressure invalid. Record rejected."; 
    ELSEIF (NEW.HUMIDITY = '-1000') THEN 
     SET @ERROR_MESSAGE = "Humidity invalid. Record rejected."; 
    END IF; 

    IF (@ERROR_MESSAGE <> '') THEN 
     INSERT INTO `weather`.`WEATHER_MEASUREMENT_ERRORS` 
     (`AMBIENT_TEMPERATURE`, 
     `GROUND_TEMPERATURE`, 
     `AIR_QUALITY`, 
     `AIR_PRESSURE`, 
     `HUMIDITY`, 
     `WIND_DIRECTION`, 
     `WIND_SPEED`, 
     `WIND_GUST_SPEED`, 
     `RAINFALL`, 
     `CREATED`, 
     `ERROR_MESSAGE`) 
     VALUES 
     (NEW.AMBIENT_TEMPERATURE, 
     NEW.GROUND_TEMPERATURE, 
     NEW.AIR_QUALITY, 
     NEW.AIR_PRESSURE, 
     NEW.HUMIDITY, 
     NEW.WIND_DIRECTION, 
     NEW.WIND_SPEED, 
     NEW.WIND_GUST_SPEED, 
     NEW.RAINFALL, 
     NEW.CREATED, 
     @ERROR_MESSAGE); 

     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @ERROR_MESSAGE; 
    END IF; 
END; 
$$ 

は助けるために試してみたい人のための支援のテーブルを作成するために必要なスクリプトです:

CREATE DATABASE IF NOT EXISTS `weather` /*!40100 DEFAULT CHARACTER SET latin1 */; 
USE `weather`; 

-- Create the WEATHER_MEASUREMENT table if it doesn't exist 
CREATE TABLE IF NOT EXISTS `WEATHER_MEASUREMENT` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `REMOTE_ID` bigint(20) DEFAULT NULL, 
    `AMBIENT_TEMPERATURE` decimal(6,2) NOT NULL, 
    `GROUND_TEMPERATURE` decimal(6,2) NOT NULL, 
    `AIR_QUALITY` decimal(6,2) NOT NULL, 
    `AIR_PRESSURE` decimal(6,2) NOT NULL, 
    `HUMIDITY` decimal(6,2) NOT NULL, 
    `WIND_DIRECTION` decimal(6,2) DEFAULT NULL, 
    `WIND_SPEED` decimal(6,2) NOT NULL, 
    `WIND_GUST_SPEED` decimal(6,2) NOT NULL, 
    `RAINFALL` decimal(6,4) DEFAULT NULL, 
    `CREATED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=4126 DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `WEATHER_MEASUREMENT_ERRORS` (
    `ID` bigint(20) NOT NULL AUTO_INCREMENT, 
    `REMOTE_ID` bigint(20) DEFAULT NULL, 
    `AMBIENT_TEMPERATURE` decimal(6,2) NOT NULL, 
    `GROUND_TEMPERATURE` decimal(6,2) NOT NULL, 
    `AIR_QUALITY` decimal(6,2) NOT NULL, 
    `AIR_PRESSURE` decimal(6,2) NOT NULL, 
    `HUMIDITY` decimal(6,2) NOT NULL, 
    `WIND_DIRECTION` decimal(6,2) DEFAULT NULL, 
    `WIND_SPEED` decimal(6,2) NOT NULL, 
    `WIND_GUST_SPEED` decimal(6,2) NOT NULL, 
    `RAINFALL` decimal(6,4) DEFAULT NULL, 
    `CREATED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `ERROR_MESSAGE` varchar(50) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=4126 DEFAULT CHARSET=latin1; 
+0

VALUES句のNEWキーワードを削除してください。 – Mihai

答えて

1

私はあなたの挿入を考えますWEATHER_MEASUREMENT_ERRORS iaもロールバックされました。 WEATHER_MEASUREMENT_ERRORSを非トランザクション(ROLLBACKは非トランザクションテーブルには適用されません)にして、MyISAMテーブルにするようにしてください。

+0

魅力的な作品です。私は非トランザクションテーブルを認識していませんでした。新しいことについて教えてくれてありがとう。 – Joshua

関連する問題