IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

upsert & returning


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut upsert & returning
    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 :

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

    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 :-)
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    C'est un manque crucial de PostGreSQL qui ne suit pas la norme SQL, pour laquelle la commande pour ce faire est MERGE qui permet aussi bien des INSERT UPDATE ou DELETE suivant le cas.
    Dans certains SGBDR comme Microsoft SQL Server la clause OUTPUT permet de savoir tout ce qui a été mis à jour...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MERGE Production.UnitMeasure AS target  
        USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)  
           ON (target.UnitMeasureCode = source.UnitMeasureCode)  
        WHEN MATCHED THEN   
            UPDATE SET Name = source.Name  
        WHEN NOT MATCHED THEN  
            INSERT (UnitMeasureCode, Name)  
            VALUES (source.UnitMeasureCode, source.Name)  
        OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
    $action contenant la nature de la modification (INSERT, UPDATE ou DELETE) et agissant comme une pseudo colonne.
    A lire :
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

    Conclusion, changez de SGBDR !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [pl/pgSQL 7.2] Returns Opaque?
    Par Gruik dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/10/2003, 16h50
  2. return ();exit() ;
    Par Zazeglu dans le forum C
    Réponses: 12
    Dernier message: 10/10/2003, 20h56
  3. [C#] Changer le focus avec la touche return
    Par sblanc74 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/10/2003, 18h38
  4. return
    Par drKzs dans le forum C
    Réponses: 3
    Dernier message: 18/09/2003, 22h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo