web-dev-qa-db-fra.com

MySQL Remplacer en requête pour une insertion de plusieurs rangées

J'essaie d'ajouter plusieurs lignes en utilisant "Remplacer dans", mais sa mise à jour d'une ligne.

REPLACE INTO user_balance
(user_id,acc_type,currency,balance,enable_deposit,
enable_withdrawal,pending_balance,update_ip)  
VALUES  (NEW.id,1,'USD',0,1,0,0,NEW.ip_address),
(NEW.id,1,'GBP',0,1,0,0,NEW.ip_address),
(NEW.id,1,'EUR',0,1,0,0,NEW.ip_address),
(NEW.id,1,'BTC',0,1,0,0,NEW.ip_address);

Est-ce correct, la façon dont je le fais?

PS: Vous utilisez un déclencheur pour mettre à jour la table de solde chaque fois qu'un utilisateur est créé dans la table des utilisateurs. Cela fonctionne bien avec si je remplace une ligne, pour plusieurs lignes, il met à jour uniquement les dernières valeurs.

3
aeroarunn

Vous devriez éviter d'utiliser des déclencheurs conjointement avec REPLACE INTO sur plusieurs rangées. Pourquoi ?

REPLACE INTO n'est rien de plus qu'un mécanique DELETE et INSERT. Il peut inciter MySQLD à adresser des impasses (voir ma réponse à comment je prévention de l'occurrence de l'impasse dans mon application? )

Voici deux commentaires indiquant le LIFO Approche to Traitement des déclencheurs

Publié par ATIF Ghaffar le 23 septembre 2007 à 21h12 [Supprimer] [modifier] Veuillez noter que le remplacement effectue une opération de suppression.

Nous n'avons pas compris cela et si les déclencheurs devaient être déclenchés sur la suppression déclenchée.

Après avoir vérifié tout le code, nous venons de trouver un script qui fait un remplacement pour actualiser les valeurs de certains champs.

Nous aurions dû avoir utilisé "insérer dans ... sur la syntaxe de mise à jour dupliquer" à la place.

Publié par J Mike le 4 mai 2009 11:06 [Supprimer] [modifier] Si vous utilisez Remplacer dans ... Les déclencheurs sont tirés dans cette commande (si la suppression de la touche DUPLCate est utilisée):

  • avant insérer
  • avant de supprimer
  • après avoir supprimé
  • après insérer

Ton problème ? Un déclencheur de mise à jour ne se déclenchera jamais si cela doit être fait plusieurs fois en une seule opération. Au moins, je ne vois pas cela se produire.

SUGGESTIONS

4
RolandoMySQLDBA