1106 votes

Insérer dans une table MySQL ou mettre à jour si elle existe

Je veux ajouter une ligne à une table de base de données, mais si une ligne existe avec la même clé unique, je veux mettre à jour la ligne.

Par exemple :

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);

Supposons que la clé unique soit ID et dans mon Base de données il existe une ligne avec ID = 1 . Dans ce cas, je veux mettre à jour cette ligne avec ces valeurs. Normalement, cela donne lieu à une erreur.
Si j'utilise INSERT IGNORE il ignorera l'erreur, mais il ne sera toujours pas mis à jour.

13 votes

SQL a besoin d'une syntaxe officielle pour ce cas d'utilisation qui ne force pas la duplication des valeurs dans la syntaxe et préserve la clé primaire.

1 votes

Pour obtenir l'identifiant influencé, voir MySQL ON DUPLICATE KEY - dernière insertion de l'id ?

1 votes

Attention : Depuis la version 5.7, cette approche ne prend pas directement en charge la clause WHERE dans le cadre de l'opération INSERT/UPDATE. De plus, une UPDATE compte en fait comme deux opérations distinctes (DELETE et INSERT) ... au cas où cela aurait de l'importance pour l'audit. (Learnbit)

1991voto

Donnie Points 17312

Utilisation INSERT ... ON DUPLICATE KEY UPDATE

QUERY :

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19

116 votes

+1 D'après ce que j'ai constaté, cette méthode est moins problématique pour les clés auto-incrémentées et autres collisions de clés uniques que REPLACE INTO, et elle est plus efficace.

61 votes

Je sais que vous y faites tous allusion, mais je tiens à être explicite pour les autres. Si l'ID que vous insérez n'est PAS la CLÉ PRIMAIRE ou UNIQUE, cela ne fonctionnera pas. Cela n'a pas fonctionné pour moi au début parce que mon ID n'était pas unique.

19 votes

C'est un peu tard, mais quoi qu'il en soit : il est indiqué dans la manuel qui se met à jour dans ON DUPLICATE KEY UPDATE augmente les lignes affectées de 2. Il indique 0 si rien n'est réellement mis à jour (comme pour la méthode régulière UPDATE ).

309voto

Martin Schapendonk Points 3517

Vérifier REPLACE :

REPLACE fonctionne exactement comme INSERT sauf que si une ancienne ligne du tableau a la même valeur qu'une nouvelle ligne d'un PRIMARY KEY ou un UNIQUE l'ancienne ligne est supprimée avant que la nouvelle ligne ne soit insérée.

Exemple :

REPLACE INTO `tablename` (`id`, `name`, `age`) VALUES (1, "A", 19)

15 votes

@Piontek Parce que celui-ci est plus court et plus facile à comprendre et que personne n'a expliqué pourquoi "insert on duplicate" est meilleur.

97 votes

Il modifie les identifiants de l'enregistrement et peut donc détruire les références étrangères.

128 votes

L'autre problème avec REPLACE INTO est que vous doit spécifier des valeurs pour TOUS les champs... sinon les champs seront perdus ou remplacés par des valeurs par défaut. REPLACE INTO essentiellement supprime la ligne si elle existe, et insère la nouvelle ligne. Dans l'exemple, si vous faites "REPLACE INTO table (id, age) values (1, 19)", le champ "name" devient nul.

25voto

Luis Reyes Points 89

Essayez ceci :

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

J'espère que cela vous aidera.

6 votes

En fait, je n'ai pas besoin d'ajouter les nouvelles valeurs à une autre ligne avec un nouvel ID, mais je veux remplacer les valeurs existantes de id = 1 par ces valeurs. (si j'ai bien compris, cela incrémente l'identifiant et ajoute les données).

59 votes

Je ne pense pas qu'il veuille augmenter l'identifiant d'une unité pour les doublons.

7 votes

"transgresser" n'est pas le mot que vous recherchez :) Malheureusement, maintenant que j'ai vu "transgresser", je ne peux plus visualiser le mot actuel

25voto

Rasel Points 1

Essayez ceci :

INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'

Remarque :
Ici, si id est la clé primaire, après la première insertion avec id='1' à chaque tentative d'insertion id='1' mettra à jour le nom et l'âge et l'âge du nom précédent sera modifié.

0 votes

Je veux travailler sans utiliser id . Avez-vous essayé sans clé primaire ?

0 votes

@ersks voir la question. l'utilisateur a posé une question sur l'existence d'une clé unique.

0 votes

J'ai compris, mais j'essaie de résoudre mon problème dans lequel ces seules valeurs sont connues. C'est donc dans cette situation que j'ai écrit le commentaire ci-dessus en espérant que la solution soit correcte.

-1voto

Dave Kiss Points 5031

J'effectuerais une recherche pour voir si id = 1 et, dans l'affirmative, utiliser UPDATE au lieu de INSERT

UPDATE table SET name="a" WHERE id = "1"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X