2009-02-18 4 views
2

Je souhaite mettre à jour une valeur de table sur Mysql 5 mais si la clé n'existe pas, créez-la.Y at-il "UPDATE la valeur SI AUCUN ROW INSERT yyy" dans MySQL?

La manière que je trouvais de le faire est par:

INSERT yyy ON DUPLICATE KEY UPDATE field; 

La question est: est le format ci-dessus moins efficace que d'autres façons de le faire (comme l'insert se produira qu'une seule fois et mise à jour arrivera très souvent)?

par exemple:

$result = UPDATE field; 
if (num_rows_effected($result)==0) INSERT yyy 

En outre: Y at-il une meilleure façon de le faire Mysql: par exemple une sorte de:

UPDATE value IF NO SUCH ROW INSERT yyy; 

Mise à jour: Pour ceux qui ont suggéré REMPLACER, voici une extension à ma question: "Merci, je dois augmenter un compteur qui est déjà dans la table (si elle existe) .Si pas créer une ligne de table avec la valeur 1 pour cette colonne Comment puis-je mettre à jour avec ce format (REMPLACER)? "

Répondre

2

Oui, vous pouvez utiliser la syntaxe « remplacer »:

REPLACE INTO table1 (key, col1, col2) values (1, 'val1','val2'); 

Ceci est une caractéristique spécifique à MySQL et n'est pas nécessairement mis en œuvre dans d'autres bases de données. En ce qui concerne l'efficacité, je pense qu'une mise à jour directe sera plus rapide, car MySQL saisit essentiellement l'erreur de clé en double et la gère en conséquence. Cependant, à moins que vous n'effectuiez de grandes quantités d'insertion/mise à jour, l'impact sur les performances sera relativement faible.

+0

Merci! J'ai besoin d'augmenter un compteur qui est déjà dans la table (s'il existe). Si ce n'est pas le cas, créez une ligne de table avec la valeur 1 pour cette colonne.Comment puis-je mettre à jour avec ce format? – Nir

0

Regardez la commande REPLACE, elle répond à vos besoins.

+0

Merci! J'ai besoin d'augmenter un compteur qui est déjà dans la table (s'il existe). Si ce n'est pas le cas, créez une ligne de table avec la valeur 1 pour cette colonne. Comment puis-je mettre à jour avec ce format? – Nir

2

Il existe également un REPLACE.

INSERT ON DUPLICATE KEY UPDATE se déclenche UPDATE déclenche quand il trébuche sur une clé en double et ne violera pas FK « s dans le cas sur UPDATE.

REPLACE se déclenche DELETE et INSERT déclencheurs, et violera 's faisant référence à la ligne étant REPLACE' FK d.

Si vous n'avez aucun déclencheur ou FK, utilisez INSERT ON DUPLICATE KEY UPDATE, c'est le plus efficace.

Vous semblez être à la recherche pour cette requête:

INSERT 
INTO table (key, counter) 
VALUES (@key, 1) 
ON DUPLICATE KEY UPDATE 
    counter = counter + 1 

Vous ne pouvez pas le faire avec REPLACE sauf si vous avez sélectionné la valeur précédente du compteur avant d'exécuter la requête.

P. S.REPLACE paru dans MySQL avant ON DUPLICATE KEY UPDATE et est maintenu uniquement pour la compatibilité. Il n'y a aucune augmentation de performance de l'utiliser.

Questions connexes