2009-09-29 6 views
4

Dans MySQL, j'essaie de trouver un moyen efficace d'effectuer une mise à jour si une ligne existe déjà dans une table, ou un INSERT si la ligne doesn ' t existe.Exécution d'un UPDATE ou d'un INSERT selon qu'une ligne existe ou non dans MySQL

J'ai trouvé deux façons possibles jusqu'à présent:

  1. L'évidence celui-ci: ouvrir une transaction, SELECT pour trouver si la ligne existe, INSERT si elle n'existe pas ou UPDATE si elle existe, commettras
  2. transaction
  3. premier INSERT IGNORE dans la table (si aucune erreur est déclenchée si la rangée existe déjà), puis mettre à jour

la seconde méthode permet d'éviter l'opération.

Laquelle, à votre avis, est la plus efficace et existe-t-il de meilleurs moyens (par exemple, l'utilisation d'un déclencheur)?

+2

Une fois, j'ai entendu cela appelé Upserting. Je l'ai trouvé pour être un terme concis gentil pour cela. Et pour une raison quelconque, ça me fait rire. –

+0

@MikeTwo me fait rire aussi, probablement parce que ça sonne comme upskirt :) – nawfal

Répondre

11
+0

Est-ce que ON DUPLICATE KEY UPDATE se met à jour si l'un des champs correspond ou seulement aux clés/champs uniques? – user97410

+0

Activé uniquement lors de la correspondance d'une entrée dans les index de clé unique/principal. –

+0

awesomeness en effet – user97410

3

Vous pouvez également effectuer une mise à jour, vérifier le nombre de lignes affectées, si elle est inférieure à 1, puis elle n'a pas trouvé de ligne correspondante, donc procéder à l'INSERT.

2

En mysql il y a une déclaration REPLACE, je crois, fait plus ou moins ce que vous voulez faire.

1

Si vous faites beaucoup de ceux-ci, il pourrait être utile de les écrire dans un fichier, puis en utilisant « LOAD DATA INFILE ... REPLACE ... »

3

Il y a une autre façon - REPLACE.

REPLACE INTO myTable (col1) VALUES (value1) 

REPLACE fonctionne exactement comme INSERT, sauf que si une ancienne ligne de la table a la même valeur que d'une nouvelle ligne pour une clé primaire ou un index UNIQUE, l'ancienne ligne est supprimée avant que la nouvelle ligne est inséré. See Section 12.2.5, “INSERT Syntax”.

2

REPLACE INTO serait une solution, il utilise le UNIQUE INDEX pour remplacer ou insérer quelque chose.

REPLACE INTO 
    yourTable 
SET 
    column = value; 

S'il vous plaît être conscient que cela fonctionne différemment de ce que vous pourriez attendre, le REPLACE est tout à fait littéralement. Il vérifie d'abord s'il y a une collision UNIQUE INDEX qui empêcherait un INSERT, il supprime (DELETE) toutes les lignes qui se rencontrent, puis INSERT s la ligne que vous lui avez donnée.

Ceci, par exemple, conduit à des problèmes subtils tels que des triggers pas de tir (car ils vérifient pour une mise à jour qui ne se produit jamais) ou des valeurs réinitialisée au défaut (parce que vous devez spécifier toutes les valeurs).

Questions connexes