J'essaie d'en savoir plus sur les déclencheurs dans mysql, alors restez avec moi. J'ai deux tables,
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)
Où la table TestTable est des mesures sur un certain élément à une date spécifique. TestTable2 contient des mesures pour un mois, une année spécifiques et l'augmentation pendant cette période.
Je veux créer un déclencheur qui met à jour ou insère des valeurs dans TestTable2 lorsque j'insère des valeurs dans TestTable.
Voici à quoi ressemblait le déclencheur que j'ai essayé de créer,
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;
Mais cela ne semble pas fonctionner, je reçois l'erreur,
Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de 'COMMENCER SI NON (EXISTE (SÉLECTIONNEZ 1 À PARTIR DE LA TABLE DE TEST OERE (ItemId = NEW.ItemId AND Yea' à la ligne 1)
Quelqu'un peut-il signaler l'erreur ou les erreurs? Ou offrez une meilleure solution à ce problème.
Tout d'abord, vous devez spécifier quand voulez-vous exécuter le déclencheur à l'intérieur du tableau. J'ai modifié votre déclencheur et j'utilise AFTER UPDATE
Et 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 ;
Remarque: faites attention à la SELECT Open FROM TestTable WHERE (Year=YEAR(NEW.Date) and Month=MONTH(NEW.Date))
, j'ai ajouté un LIMIT 1
Pour éviter les lignes en double.
Changer la base de données TEST
.
Vous pouvez également utiliser ON DUPLICATE KEY
sur l'exécution des deux déclencheurs.
Vous pouvez obtenir plus d'informations dans le manuel de documentation de MySQL.