2017-10-15 9 views
2

J'essaie de créer un déclencheur qui met à jour une ligne dans une autre table d'une insertion. La dernière partie fonctionne mais s'il n'y a pas de ligne avec cet identifiant, je veux créer une ligne pour cet identifiant avant de l'ajouter.SQL-Trigger: Créer une ligne si la ligne n'existe pas

Mais je reçois un # 1064 erreur:. 'Resource_xpEvents pour chaque ligne BEGIN SINON EXISTE (CHOISIR 1 À PARTIR resource_xp'

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT resource_xpEvents FOR EACH ROW 
BEGIN 
IF NOT EXISTS (SELECT 1 FROM resource_xp WHERE userId = NEW.userId) THEN 
    INSERT INTO resource_xp (userId) 
    VALUES (NEW.userId); 
END IF; 

UPDATE resource_xp 
    SET xp = xp + new.delta 
    WHERE userId = new.userId 

END $$ 
DELIMITER ; 

Répondre

0

Essayez ceci:

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT ON resource_xpEvents FOR EACH ROW 
BEGIN 
IF NOT EXISTS (SELECT 1 FROM resource_xp WHERE userId = NEW.userId) THEN 
    INSERT INTO resource_xp (userId) 
    VALUES (NEW.userId); 
END IF; 

UPDATE resource_xp 
    SET xp = xp + new.delta 
    WHERE userId = new.userId; 

END $$ 
DELIMITER ; 

Si vous voulez expérimenter:

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT ON resource_xpEvents FOR EACH ROW 
BEGIN 

    REPLACE INTO resource_xp (userId,xp) values (NEW.userId,xp+new.delta); 

END $$ 
DELIMITER ; 

qui est plus lisible , mais la performance est pire.

+0

vous obtenez l'erreur lorsque vous essayez d'installer le déclencheur? – farbiondriven

+0

Mon mauvais. Une autre erreur: Erreur dans la syntaxe à 'END' sur la ligne 12 –

+2

Parce qu'il vous manque a; à la fin de la déclaration de mise à jour. –

0

Vous pouvez essayer d'utiliser la syntaxe de MySQL INSERT ... ON DUPLICATE KEY UPDATE ici d'abord, si le userId colonne n'est pas déjà unique, le rendre unique:

ALTER TABLE resource_xp ADD CONSTRAINT UNIQUE (userId); 

Ensuite, au lieu d'essayer de faire une déclaration d'insertion et la mise à jour conditionnelle séparée, faites la seule déclaration suivante:

INSERT INTO resource_xp (userId) 
VALUES (NEW.userId) 
ON DUPLICATE KEY UPDATE xp = xp + NEW.delta 

Voici le code pour le déclencheur complet suggéré:

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT resource_xpEvents FOR EACH ROW 
BEGIN 
    INSERT INTO resource_xp (userId) 
    VALUES (NEW.userId) 
    ON DUPLICATE KEY UPDATE xp = xp + NEW.delta 
END $$ 
DELIMITER ;