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.
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),
...
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);