web-dev-qa-db-fra.com

Résultat du stockage défini dans la table temporaire, les variables variables ou séparées dans une gâchette

Je suis en train de créer des déclencheurs pour stocker la note moyenne d'un produit donné sur la table des produits. On m'a également demandé de stocker le nombre total de commentaires pour le produit. Donc, j'ai besoin de récupérer 2 valeurs dans ma gâchette, puis mettez à jour la table cible de manière appropriée.

Devrais-je utiliser des instructions de sélection séparées

SET my_a = SELECT a FROM foo;
SET my_b = SELECT b FROM foo;

une seule déclaration pour récupérer un ensemble de résultats comme une variable (est-ce encore possible?):

SET var = SELECT (a,b) FROM foo; 
UPDATE bar SET c=var.a,d=var.b;

ou peut-être même stocker le résultat défini dans une table temporaire dans la gâchette (-que même possible?)?

2
sunwukung

La première méthode est la meilleure en raison du moins de frais généraux pour les requêtes générées. En fait, dans le langage de la procédure stockée MySQL, vous souhaitez que peu de variables déclarées que possible.

La seconde n'est pas possible car le langage Rrocedure stocké MySQL n'a pas de support d'objet. Une jointure de mise à jour maladroite mais courante est possible si vous ...

  1. mettez à jour la question avec l'instruction Créer une table pour la table du produit.
  2. montrez-nous la défonction de déclenchement que vous avez jusqu'à présent

La troisième méthode n'est pas possible car explicite DDL et DDL via Dynamic SQL ne sont pas autorisés dans les déclencheurs MySQL .

Vous devrez peut-être créer une table régulière à l'aide du myisam ou [~ # ~ # ~] mémoire [~ # ~] Moteur de stockage. Ensuite, vous pouvez avoir la gâchette compiler vos données à une table qui existe réellement. myisam est meilleur car un serveur doit-il descendre, les données compilées jusqu'à présent sont sur le disque. MÉMOIRE Les tables sont plus rapides d'écrire à, mais sont allés sur le redémarrage du système.

N'utilisez pas Créez une table temporaire AT tout Parce que ces tables ne durent que tant que la connexion DB vit, et serait privé à l'appel du déclencheur aussi. Même pire, si vous utilisez une réplication MySQL et que vous exécutez STOP SLAVE Sur l'esclave, les tables créées via Créer une table temporaire disparaissent du thread et de la réplication SQL immédiatement lorsque vous exécutez START SLAVE Et celles-ci Les tables temporaires n'existent plus.

4
RolandoMySQLDBA

Ceci est une question assez ancienne, alors peut-être que cette syntaxe n'existait pas précédemment, mais maintenant, vous pouvez simplement utiliser SELECT INTO :

SELECT a, b INTO my_a, my_b FROM foo;

Je trouve que cela soit esthétiquement plus propre que la première syntaxe et la requête ne doit être exécutée qu'une seule fois.

1
p.s.w.g