web-dev-qa-db-fra.com

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

J'ai une requête SQL où je veux insérer plusieurs lignes dans une requête unique. alors j'ai 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 clé UNIQUE (qui n'est pas la clé PRIMARY KEY), par exemple. 'name' ci-dessus, doit être cochée et si un tel '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' étant 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 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),
      ('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. S'il vous plaît donnez-moi une direction. Merci.

186
Prashant

Utilisez le mot-clé VALUES pour faire référence à de nouvelles valeurs (voir 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),
     ...
435
Peter Lang

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

pour SQL Server, la solution 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);
2
li rachel