web-dev-qa-db-ja.com

トリガーMySql更新の作成または別のテーブルへの挿入

私はmysqlのトリガーについてもっと学びたいので、我慢してください。 2つのテーブルがあります。

TestTable  
 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ItemId INTEGER,Date date, Value REAL)

TestTable2
 (id INTEGER PRIMARY KEY AUTO_INCREMENT, ItemId INTEGER,Year INTEGER, Month INTEGER, Open REAL, Close REAL, Increase REAL)

テーブルTestTableは、特定の日付の特定のアイテムの測定値です。 TestTable2には、特定の月、年、およびこの期間の増加の測定値が含まれています。

TestTableに値を挿入するときに、TestTable2に値を更新または挿入するトリガーを作成します。

これは私が作成しようとしたトリガーはどのようなものでしたか、

CREATE TRIGGER 'monthUpdateTrigger' AFTER INSERT ON TestTable 
BEGIN 
IF NOT (EXISTS (SELECT 1 FROM TestTable2 WHERE 
(ItemId=NEW.ItemId AND Year=YEAR(NEW.Date) AND Month=MONTH(NEW.Date)))) 
THEN 
    INSERT INTO TestTable2 (ItemId,Year,Month,Open,Close,Increase ) VALUES 
    (NEW.ItemId , YEAR(NEW.Date), MONTH(NEW.Date),NEW.Value,NEW.Close,0.0); 
ELSE
    UPDATE TestTable2 SET Close=NEW.Close AND Increase=(NEW.Close/(SELECT 
    Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date))) 
    WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date))
END IF;
END;

しかし、これはうまくいかないようです、私はエラーが出ます、

SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、BEGIN IF NOT(EXISTS(SELECT 1 FROM TestTable WHERE(ItemId = NEW.ItemId AND Yea ')の近くで使用する正しい構文を確認してください)

誰かがエラーを指摘できますか?または、この問題のより良い解決策を提供してください。

6
VbN

まず、テーブル内でトリガーを実行するタイミングを指定する必要があります。トリガーを編集して_AFTER UPDATE_と_AFTER INSERT_を使用しました:

挿入後:

_USE `TEST`;
DELIMITER $$
DROP TRIGGER IF EXISTS MEDICAMENTO.monthUpdateTriggerAI$$
USE `TEST`$$
    CREATE DEFINER = CURRENT_USER TRIGGER `TEST`.`monthUpdateTriggerAI` AFTER INSERT ON `TestTable` FOR EACH ROW
    BEGIN
    SET @COUNT=(SELECT COUNT(*) FROM TestTable2 WHERE (ItemId=NEW.ItemId AND Year=YEAR(NEW.Date) AND Month=MONTH(NEW.Date)));
    IF @COUNT=0 THEN
        INSERT INTO TestTable2 (ItemId,Year,Month,Open,Close,Increase ) VALUES 
        (NEW.ItemId , YEAR(NEW.Date), MONTH(NEW.Date),NEW.Value,NEW.Close,0.0); 
    ELSE
        UPDATE TestTable2 SET TestTable2.Close=NEW.Close AND Increase=(NEW.Close/(SELECT 
        Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date)) LIMIT 1))
        WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date));
    END IF;
    END;
$$
DELIMITER ;
_

更新後:

_USE `TEST`;
DELIMITER $$
DROP TRIGGER IF EXISTS MEDICAMENTO.monthUpdateTriggerAU$$
USE `TEST`$$
    CREATE DEFINER = CURRENT_USER TRIGGER `TEST`.`monthUpdateTriggerAU` AFTER UPDATE ON `TestTable` FOR EACH ROW
BEGIN

    UPDATE TestTable2 SET TestTable2.Close=NEW.Close AND Increase=(NEW.Close/(SELECT 
    Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date)) LIMIT 1))
    WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date));

END;
$$
DELIMITER ;
_

注:SELECT Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date))に注意してください。重複する行を避けるために_LIMIT 1_を追加しました。

データベースを変更TEST

2つのトリガーの実行で _ON DUPLICATE KEY_ を使用することもできます。

詳細については、MySQLのドキュメントマニュアルを参照してください。

2
oNare