Maison >base de données >tutoriel mysql >Comment mettre à jour une ligne dans la même table après avoir inséré une nouvelle ligne dans MySQL ?

Comment mettre à jour une ligne dans la même table après avoir inséré une nouvelle ligne dans MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 06:58:18869parcourir

How to Update a Row in the Same Table after Inserting a New Row in MySQL?

Déclencheur MySQL : définir des valeurs pour une NOUVELLE ligne et en mettre à jour une autre dans la même table

Dans MySQL, les déclencheurs sont des mécanismes puissants qui vous permettent de effectuer des actions spécifiques lorsque certains événements se produisent dans une table. Un cas d'utilisation courant consiste à définir des valeurs pour la ligne nouvellement insérée (NEW) tout en mettant également à jour une autre ligne dans la même table. Cependant, une erreur courante peut se produire lors de la tentative de cette opération :

ERREUR 1442 : Impossible de mettre à jour la table 'split' dans la fonction/le déclencheur stocké car elle est déjà utilisée par l'instruction qui a invoqué cette fonction/le déclencheur stocké.

Cette erreur se produit car un déclencheur ne peut pas mettre à jour la même table à partir de laquelle il a été déclenché. Pour surmonter cette limitation, suivez cette approche alternative :

Utilisation d'une procédure stockée :

Au lieu d'utiliser un déclencheur, créez une procédure stockée qui gère les opérations d'insertion et de mise à jour. Voici un exemple :

<code class="sql">DELIMITER $$
CREATE PROCEDURE split_before_ins(IN startDate DATE, IN endDate DATE, IN tcOfficeFee DECIMAL, IN globalFee DECIMAL)
BEGIN
  -- Insert a new row with the provided parameters
  INSERT INTO im.split (startDate, endDate, tcOfficeFee, globalFee)
  VALUES (startDate, endDate, tcOfficeFee, globalFee);
  
  -- Update the previous row's endDate
  UPDATE im.split
  SET endDate = DATE_SUB(startDate, INTERVAL 1 DAY)
  WHERE procKey = (SELECT procKey FROM im.split ORDER BY procKey DESC LIMIT 1)
  AND endDate = '20501231';
END$$
DELIMITER ;</code>

Utilisation de la procédure :

Pour appeler la procédure stockée, exécutez ce qui suit :

<code class="sql">CALL split_before_ins('2023-01-01', '2024-12-31', 10.00, 100.00);</code>

Cette procédure stockée Cette approche vous permet d'effectuer les opérations souhaitées dans un seul contexte transactionnel, évitant ainsi l'erreur rencontrée lors de l'utilisation d'un déclencheur pour mettre à jour la même table à partir de laquelle il a été appelé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn