résultat du magasin situé dans la table temporaire, variable ou variables distinctes dans un déclencheur

dba.stackexchange https://dba.stackexchange.com/questions/3479

  •  16-10-2019
  •  | 
  •  

Question

Je suis en train de créer des déclencheurs pour stocker la la note moyenne pour un produit donné sur la table des produits. On m'a demandé aussi de stocker le nombre total de commentaires pour le produit. Alors - Je dois récupérer 2 valeurs dans mon déclencheur, puis mettre à jour la table cible appropriée.

Dois-je utiliser des instructions select séparés

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

une seule instruction pour récupérer un jeu de résultats en tant que variable (est-ce possible?):

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

ou peut-être même stocker le jeu de résultats dans une table temporaire au sein de la gâchette (est que même possible?)?

Était-ce utile?

La solution

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 la procédure stockée MySQL langue, vous voulez que quelques variables déclarées possibles.

La seconde est impossible depuis le MySQL stocké Rrocedure Langue ne prend pas en charge de l'objet. Un maladroit mais ACTUALISATION réalisable JOIN est possible si vous ...

  1. mettre à jour la question avec l'instruction CREATE TABLE pour la table produit
  2. nous montrer la défintion de déclenchement vous avez jusqu'à présent

La troisième méthode est impossible en raison explicite DDL et via Dynamic SQL DDL ne sont pas autorisés dans les triggers MySQL .

Vous pouvez avoir à créer une table régulière en utilisant soit la MyISAM ou mÉMOIRE stockage moteur. Ensuite, vous pouvez avoir la gâchette compiler vos données à une table qui existe réellement. MyISAM est mieux parce que si un serveur descendre , les données compilées à ce jour est sur le disque. mémoire sont plus rapides à écrire, mais sont partis au redémarrage du système.

NE PAS UTILISER CREATE TABLE TEMPORAIRE TOUT parce que ces tableaux ne durent pas aussi longtemps que la vie de connexion DB, et seraient privés jusqu'à l'appel de la détente aussi. Pire encore au large, si vous utilisez la réplication MySQL et que vous exécutez STOP SLAVE sur l'esclave, toutes les tables créées via CREATE TABLE TEMPORAIRE disparaît de la rupture du fil de SQL et de réplication immédiatement lorsque vous exécutez START SLAVE et les tables temporaires ne plus exister.

Autres conseils

Ceci est une question assez vieux, alors peut-être cette syntaxe n'existait pas auparavant, mais maintenant vous pouvez simplement utiliser SELECT INTO :

SELECT a, b INTO my_a, my_b FROM foo;

Je trouve cela d'être esthétiquement plus propre que la première syntaxe, et la requête ne doit fonctionner qu'une seule fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top