MySQL Déclencheur - le Stockage d'un SELECT dans une variable
J'ai un déclencheur dans lequel je veux avoir une variable qui contient un INT I obtenir à partir d'une SELECT
, donc je peux l'utiliser dans les deux CAS énoncés au lieu d'appeler la SELECT
deux fois. Comment avez-vous déclarer/utiliser des variables dans MySQL déclencheurs?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez déclarer des variables locales dans MySQL déclenche, avec la
DECLARE
syntaxe.Voici un exemple:
Lorsque vous affectez une valeur à une variable, vous devez vous assurer que la requête ne retourne qu'une seule valeur, et non pas un ensemble de lignes ou un ensemble de colonnes. Par exemple, si votre requête renvoie une valeur unique dans la pratique, c'est ok, mais dès qu'il renvoie plus d'une ligne, vous obtenez "
ERROR 1242: Subquery returns more than 1 row
".Vous pouvez utiliser
LIMIT
ouMAX()
à assurez-vous que la variable locale est définie à une valeur unique.@
) de sorte que la variable a la valeur après l'insertion est fait. Ensuite, vous pouvez vérifier quelle est la valeur de votre variable de session.SET NEW.DoctorName = (select current_user())
mais il me montre la valeur en DoctorName à l'utilisateur qui crée le déclencheur.USER()
fonction, pasCURRENT_USER()
. Lire dev.mysql.com/doc/refman/8.0/en/...: "les Déclencheurs et les événements ont pas d'option pour définir la SÉCURITÉ SQL caractéristique, donc, pour ces objets, CURRENT_USER() retourne le compte de l'utilisateur qui définit l'objet. Pour revenir à l'invocateur, à l'utilisation de l'UTILISATEUR() ou SESSION_USER()."Ne pas essayer @ home
Ou vous pouvez simplement inclure l'instruction SELECT dans la requête SQL de l'invocation de la gâchette, de sorte que son passé en tant que l'une des colonnes dans le déclenchement de ligne(s). Aussi longtemps que vous êtes certain qu'il sera infailliblement renvoie une seule ligne (donc une seule valeur). (Et, bien sûr, il ne doit pas retourner une valeur qui interagit avec la logique dans le déclenchement, mais c'est vrai en tout cas.)
Je poste cette solution car j'ai eu un moment difficile de trouver ce dont j'avais besoin. Ce post m'a fait assez proche (+1 pour que je vous remercie), et c'est la solution finale pour en réorganisant les données de la colonne avant de l'insérer si les données correspondent à un test.
Remarque: c'est à partir d'un le projet de l'héritage j'ai hérité d'où:
rridprefix
+rrid
on duplicate key
est pas l'idéal, car les colonnes sont trop nombreux et peuvent changerDe toute façon, ici, est l'élément déclencheur qui met tout en double de clés dans un héritage de la colonne tout en nous permettant de stocker l'héritage, les données de mauvaise qualité (et de ne pas déclencher l'acquisition de tables composite, la clé unique).