MySQL ON DUPLICATE KEY UPDATE pour l'insertion de plusieurs lignes dans une seule requête

200

J'ai une requête SQL où je veux insérer plusieurs lignes dans une seule requête. j'ai donc utilisé quelque chose comme:

$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

Le problème est que lorsque j'exécute cette requête, je veux vérifier si une UNIQUEclé (qui n'est pas la PRIMARY KEY), par exemple 'name'ci-dessus, doit être vérifiée et si une telle 'name'existe déjà, la ligne entière correspondante doit être mise à jour sinon insérée.

Par exemple, dans l'exemple ci-dessous, si 'Katrina'est déjà présent dans la base de données, la ligne entière, quel que soit le nombre de champs, doit être mise à jour. Encore une fois s'il 'Samia'n'est pas présent, la ligne doit être insérée.

J'ai pensé à utiliser:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

Voici le piège. Je suis resté coincé et confus sur la façon de procéder. J'ai plusieurs lignes à insérer / mettre à jour à la fois. Veuillez me donner une direction. Merci.

Prashant
la source

Réponses:

480

Utilisez le mot-clé VALUESpour faire référence aux nouvelles valeurs (voir la documentation ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...
Peter Lang
la source
2
Que faire si nous devons inclure une instruction IF dans la MISE À JOUR qui a une condition différente pour chaque ligne?
logique
2
@logic: Il y a plusieurs questions liées à cela: recherche StackOverflow . Si aucun d'eux ne répond à votre question, veuillez en poster une nouvelle expliquant exactement ce dont vous avez besoin.
Peter Lang
@logic, vous avez trouvé une solution à votre problème? actuellement, je suis confronté au même problème
Parth kharecha
Grande suggestion. Si vous souhaitez incrémenter une valeur lors de la duplication, ajoutez ceci après la partie "ON DUPLICATE KEY UPDATE": total = total + VALUES (total)
phoenix
1

INSERT INTO ... ON DUPLICATE KEY UPDATE ne fonctionnera que pour MYSQL, pas pour SQL Server.

pour SQL Server, la façon de contourner ce problème consiste à déclarer d'abord une table temporaire, à insérer une valeur dans cette table temporaire, puis à utiliser MERGE

Comme ça:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);
li rachel
la source
15
Qui utilise le serveur SQL cependant: D
Jeremy Belolo
-3

Vous pouvez utiliser Remplacer au lieu de INSÉRER ... SUR LA MISE À JOUR DE LA CLÉ DUPLICATE.

a1ex07
la source
28
Oui, mais en utilisant REMPLACER, l'ancienne ligne est supprimée avant l'insertion de la nouvelle ligne. Je souhaite conserver l'ancienne ligne pour conserver les identifiants principaux.
Prashant
2
Je ne savais pas que conserver l'ancien PK est en quelque sorte important pour vous ... Sûrement, REMPLACER ne fonctionnera pas dans ce cas ...
a1ex07
4
PS: "replace into" nécessite à la fois des privilèges de suppression et d'insertion!
Oliver M Grech
2
et pour les raisons de suppression / insertion mentionnées ci-dessus, son aussi beaucoup plus lent dans ces cas.
Ross
1
Et si vous souhaitez mettre à jour quelques colonnes? Remplacer mettra tout à jour.
imVJ