MySQL ON DUPLICATE KEY UPDATE pour plusieurs lignes insérer dans une seule requête

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

$sql = "INSERT INTO beautiful (name, age) VALUES ('Helen', 24), ('Kasortingna', 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 clé UNIQUE (qui n’est pas la PRIMARY KEY ), par exemple 'name' ci-dessus, doit être cochée et si un tel 'name' existe déjà, la ligne entière correspondante devrait être mis à jour sinon inséré.

Par exemple, dans l’exemple ci-dessous, si 'Kasortingna' est déjà présent dans la firebase database, la ligne entière, quel que soit le nombre de champs, doit être mise à jour. Encore une fois si '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), ('Kasortingna', 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. S’il vous plaît donnez-moi une direction. Merci.

Utilisez le mot-clé VALUES pour faire référence à de nouvelles valeurs (voir documentation ).

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

Vous pouvez utiliser Replace au lieu de INSERT … ON DUPLICATE KEY UPDATE.

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

pour SQL Server, la solution consiste à déclarer 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), ('Kasortingna', 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);