web-dev-qa-db-fra.com

Créer une mise à jour Trigger MySql ou insérer dans une autre table

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.

6
VbN

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:

APRÈS L'INSERTION:

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 ;

APRÈS LA MISE À JOUR:

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.

2
oNare