Bonjour,
Le but est d'insérer ou mettre à jour la valeur "c" selon les couples "a" et "b". Si ça existe, on met à jour, si ça n'existe pas on crée, mais dans tous les cas on renvoie ce qui a été créé ou modifié en sortie de requête pour que l'appelant puis "savoir".
Selon le pattern "update or insert", j'ai fait ceci :
Le soucis c'est que ça ne me retourne que ce qui a été inséré et pas ce qui a été mis à jour. J'ai essayé plein de trucs avec des unions pour remonter vers l'alias "upsert", mais rien à faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 CREATE TABLE my_table ( id BIGSERIAL PRIMARY KEY, a INTEGER, b INTEGER, c INTEGER ); WITH new_values(a, b, c) AS ( VALUES (1, 2, 3) ), upsert AS ( UPDATE my_table m SET a = nv.a, b = nv.b, c = nv.c FROM new_values nv WHERE m.a = nv. AND m.b = nv.b RETURNING m.id, m.a, m.b, m.c ) INSERT INTO my_table (a, b, c) SELECT new_values.a, new_values.b, new_values.c FROM new_values LEFT JOIN upsert up ON up.a = new_values.a AND up.b = new_values.b WHERE up.id IS null RETURNING id, a, b, c;
Je peux contourner le truc par le code applicatif mais si je peux éviter c'est mieux.
Une idée de comment s'y prendre ?
A bientôt la team :-)
Partager