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!