2017-01-08 2 views
0

Je suis vraiment mauvais en SQL, mais j'essaie de garder ma base de données simple et minimaliste que possible. Ne pas dupliquer les valeurs mais utiliser des références et des id à la place.# 1442 - Impossible de mettre à jour la table '*' dans la fonction/trigger stockée car elle est déjà utilisée par une instruction qui a invoqué cette fonction/déclencheur

Maintenant, après avoir inséré une requête que j'obtiens l'erreur

1442 - Impossible de mettre à jour la table « signé » en fonction/déclencheur stocké car il est déjà utilisé par une déclaration qui a invoqué cette fonction stockée/déclencheur

La requête peut être insérée lorsque le déclencheur est désactivé. Mais ma requête ne lit que les utilisateurs de la table, donc il ne devrait pas y avoir de conflit. J'ai lu quelque chose au sujet de l'interblocage - la requête verrouille la table en l'utilisant ou quelque chose comme ça et donc un déclencheur ne peut pas mettre à jour une rangée? Des idées comment pourrais-je y parvenir? J'ai simplifié ma requête pour que seules les choses importantes soient présentes.

Requête:

INSERT INTO signed (time_of_start, player) 
    SELECT time_of_game_id, users.user_id 
    FROM time_of_game, users 
    WHERE time_of_game.time_of_start = "2017-02-01 12:00:00" 
     AND users.steamid = "123456789"; 

Trigger:

CREATE TRIGGER `payment_for_joining` 
AFTER INSERT ON `signed` 
FOR EACH ROW 
    UPDATE users 
    SET users.credit = users.credit-1 
    WHERE users.user_id = NEW.player 

Répondre

0

Il ne vous permettra pas de mettre à jour la table car il est déjà en cours de lecture par la requête INSERT INTO.. SELECT qui invoque ce déclencheur.

Une autre façon serait de désactiver le déclencheur et mettre à jour la table des utilisateurs séparément, par exemple .:

INSERT INTO signed (time_of_start, player) 
SELECT time_of_game_id, users.user_id FROM time_of_game, users 
WHERE time_of_game.time_of_start="2017-02-01 12:00:00" 
AND users.steamid="123456789"; 

UPDATE users join time_of_game SET users.credit = users.credit-1 
where time_of_game.time_of_start="2017-02-01 12:00:00" 
AND users.steamid="123456789"; 

Vous pouvez ajouter une colonne se joindre à ON clause s'il y a une colonne qui relie ces deux tables.

+0

Oui, j'espérais juste pouvoir faire 2 opérations avec seulement une requête/requête. Mais je vais prendre un pourboire du programmeur plus expérimenté, j'utilise votre solution :) Merci – Vergil333