Maison > base de données > tutoriel mysql > Comment éviter les mises à jour en double dans un déclencheur MySQL lors de l'insertion de plusieurs lignes ?

Comment éviter les mises à jour en double dans un déclencheur MySQL lors de l'insertion de plusieurs lignes ?

Barbara Streisand
Libérer: 2024-11-29 06:38:13
original
585 Les gens l'ont consulté

How to Prevent Duplicate Updates in a MySQL Trigger When Inserting Multiple Rows?

Déclencheur MySQL pour mettre à jour la colonne dans une autre table lors de l'insertion

Dans un système de base de données relationnelle, vous pouvez rencontrer le besoin d'effectuer automatiquement une opération sur une table lorsqu'un changement se produit dans une autre table associée. C'est là que les déclencheurs sont utiles. Dans ce cas spécifique, nous visons à créer un déclencheur dans MySQL qui met à jour une colonne de la table BookingRequest lorsqu'une nouvelle ligne est insérée dans la table OccupiedRoom.

Le déclencheur que vous avez présenté tente de mettre à jour la colonne d'état dans la table OccupiedRoom. Table BookingRequest directement après avoir inséré une ligne dans la table OccupiedRoom. Cependant, le problème avec cette approche est que le déclencheur est défini pour s'exécuter pour chaque ligne insérée dans la table OccupiedRoom, ce qui signifie qu'il sera exécuté plusieurs fois si plusieurs lignes sont insérées simultanément. Cela peut entraîner des mises à jour de données incorrectes ou incohérentes.

Pour résoudre ce problème, nous devons modifier le déclencheur pour mettre à jour uniquement la colonne de statut dans la table BookingRequest si une ligne correspondante existe déjà. Voici une version révisée du déclencheur :

DELIMITER $$
CREATE TRIGGER occupy_trig
AFTER INSERT ON `OccupiedRoom` FOR EACH ROW
begin
  DECLARE id_exists Boolean;
  -- Check BookingRequest table
  SELECT 1
  INTO @id_exists
  FROM BookingRequest
  WHERE BookingRequest.idRequest= NEW.idRequest;

  IF @id_exists = 1
  THEN
    UPDATE BookingRequest
    SET status = '1'
    WHERE idRequest = NEW.idRequest;
  END IF;
END;
$$
DELIMITER ;
Copier après la connexion

Ce déclencheur utilise une sous-requête pour vérifier si une ligne correspondante existe dans la table BookingRequest en fonction de la colonne idRequest. Si une ligne correspondante est trouvée, le déclencheur met à jour la colonne d'état sur « 1 ». En incorporant cette vérification, nous garantissons que le déclencheur met à jour uniquement les lignes pertinentes de la table BookingRequest et élimine le risque de mises à jour incorrectes ou en double.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal