Maison  >  Questions et réponses  >  le corps du texte

Erreur MySql : la table d'une fonction/déclencheur stocké ne peut pas être mise à jour car elle est déjà utilisée par une instruction qui appelle cette fonction/déclencheur stocké

J'exécute une requête MySQL. Cependant, lors de l'ajout d'une nouvelle ligne à partir de la saisie du formulaire, j'obtiens cette erreur :

Error: Can't update table 'brandnames' in stored function/trigger because it is 
already used by statement which invoked this stored function/trigger.

D'après le code :

CREATE TRIGGER `capital` AFTER INSERT ON `brandnames`
FOR EACH
ROW UPDATE brandnames
SET bname = CONCAT( UCASE( LEFT( bname, 1 ) ) , LCASE( SUBSTRING( bname, 2 ) ) )

Que signifie cette erreur ?

P粉668804228P粉668804228370 Il y a quelques jours628

répondre à tous(2)je répondrai

  • P粉573809727

    P粉5738097272023-10-16 17:19:55

    La syntaxe correcte est :

    FOR EACH ROW SET NEW.bname = CONCAT( UCASE( LEFT( NEW.bname, 1 ) )
                                       , LCASE( SUBSTRING( NEW.bname, 2 ) ) )

    répondre
    0
  • P粉921165181

    P粉9211651812023-10-16 11:22:02

    Quand INSERT 触发器触发时,您无法更改表。 INSERT certaines opérations de verrouillage peuvent être effectuées, ce qui peut entraîner un blocage. De plus, la mise à jour de la table à partir d'un déclencheur entraînera le déclenchement à nouveau du même déclencheur dans une boucle récursive infinie. Ces deux raisons expliquent pourquoi MySQL vous empêche de faire cela.

    Cependant, en fonction de ce que vous souhaitez réaliser, vous pouvez utiliser NEW.fieldname 访问新值,甚至可以使用旧值 - 如果执行 UPDATE --OLD.

    Si vous avez un champ nommé full_brand_name 的行,并且您想在 small_name utilisant les deux premières lettres comme nom court, vous pouvez utiliser :

    CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
    FOR EACH ROW BEGIN
      SET NEW.short_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
    END

    répondre
    0
  • Annulerrépondre