2017-09-24 1 views
0

Est-il possible d'insérer un type de mise à jour conditionnelle dans un déclencheur mysql? Si j'ai besoin de faire quelque chose après un certain type de mise à jour, par exemple si la mise à jour est un certain type de changement dans la valeur du champ. Mieux dit, si j'ai besoin d'incrémenter une valeur dans une autre table après qu'un champ spécifique dans ma table d'origine change sa valeur à une valeur spécifique, est-ce possible? Toute aide sera grandement appréciée.
J'essaie ceci:Déclencheur MySQL avec conditions sur UPDATE

CREATE TRIGGER Increment 
AFTER UPDATE ON Subscription 
FOR EACH ROW 
BEGIN 
UPDATE USER 
SET num_sub=num_sub+1 
IF NEW.State <> OLD.State AND NEW.STATE='C' 
END IF 
END 

Mais cela ne fonctionne pas, erreur de syntaxe. J'insère le déclencheur via phpmyadmin.

+0

Oui, en d'autres termes, lorsque vous exécutez un trigger sur certaines tables, vous pouvez toujours insérer/mettre à jour/supprimer sur une table différente, à condition que cette table ne dispose pas de DML sur la première table. Donnez un exemple de ce que vous essayez de faire. –

+2

'SI NEW.column1 <> OLD.column1 et NEW.column1 = 'valeur spécifique' UPDATE table2 ...'. Vous devez publier les instructions CREATE pour les deux tables et être plus précis dans votre question, si vous voulez une bonne réponse. –

+0

Possible duplication de [déclencheur MySQL sur les événements d'insertion/mise à jour] (https://stackoverflow.com/questions/15975877/mysql-trigger-on-insert-update-events) – cwallenpoole

Répondre

1

Essayez quelque chose comme ceci:

CREATE TRIGGER Increment 
AFTER UPDATE ON Subscription 
FOR EACH ROW 
BEGIN 
    IF NEW.State <> OLD.State AND NEW.STATE='C' THEN 
     UPDATE USER 
     SET num_sub=num_sub+1 
     WHERE USER.id = NEW.user_id; -- change this condition as you need 
    END IF; 
END 

Cela devrait également travailler:

CREATE TRIGGER Increment 
AFTER UPDATE ON Subscription 
FOR EACH ROW 
    UPDATE USER 
    SET num_sub=num_sub+1 
    WHERE USER.id = NEW.user_id 
     AND NEW.State <> OLD.State 
     AND NEW.STATE='C'; 

Note: NEW et OLD font référence à la ligne de la table Subscription qui est mise à jour. OLD contient les valeurs avant la mise à jour. NEW contient les valeurs après la mise à jour. Donc, pour vérifier si le state a été modifié, vous pouvez comparer NEW.State <> OLD.State.

+0

USER.id doit être USER.id de la table USER ou de la table SUBSCRIPTION? (évidemment, il y a un FK sur subscription.userS qui pointe sur user.id). Merci!! – JamieITGirl

+1

C'était juste un quess, puisque vous n'avez pas fourni le schéma et la relation. Maintenant, changez cette ligne en 'WHERE USER.id = NEW.userS'. BTW: 'USER.id' signifie colonne' id' de la table 'USER'. 'NEW.userS' est la colonne' userS' de la ligne que vous venez de mettre à jour dans la table 'Subscription'. –

+0

J'ai juste essayé mais il ne fait rien sur la table USER. Peut-être que c'est parce que Subscription.UserS pointe vers User.id mais ce n'est pas la clé primaire de la table d'abonnement? Si c'est le cas, comment puis-je résoudre? – JamieITGirl