私は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 ')の近くで使用する正しい構文を確認してください)
誰かがエラーを指摘できますか?または、この問題のより良い解決策を提供してください。
まず、テーブル内でトリガーを実行するタイミングを指定する必要があります。トリガーを編集して_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のドキュメントマニュアルを参照してください。