Page 1 sur 1

[PostgreSQL] équivalence du On KEY UPDATE

Posté : 20 août 2009, 18:02
par Rem73
Bonjour,

J'avais fait anciennement des recherches parce que je savais que j'allais passer à postgresql. Mais j'ai perdu mes recherches et je ne trouve rien :s

C'est pourquoi je vous demande comment je pourrais faire l'équivalence de ON DUPLICATE KEY UPDATE.
Je l'utilise pour insérer un enregistrement si il existe pas, sinon je le met à jour. Sachant que cette requête là va travailler sur une table qui serra très chargée (session PHP) je me demande si il y a pas d'autres procéder. Puisque en moyenne il y aura plus de mise à jour que d'insertion.

Aussi je débute dans le monde de postgresql donc je connais pas beaucoup de ses fonctionnalités et comment ce sgbd fonctionne. C'est le moment de me mettre à l'anglais je pense ^^
Si vous avez quelques liens ça serait très gentil :D

Merci d'avance.

Re: [PostgreSQL] équivalence du On KEY UPDATE

Posté : 20 août 2009, 20:23
par Rem73
J'ai retrouver une de mes recherches, j'avais trouver comme solution d'utiliser MERGE.
J'ai trouvé ce-ci : http://en.wikipedia.org/wiki/Merge_(SQL) cependant j'ai eu une erreur SQL et j'ai cherche un exemple : http://www.idevelopment.info/data/Oracl ... L_14.shtml
Mais je comprend rien :s

J'espère que vous pouvez m'aider, parce que j'y arrive pas du tout.

Merci d'avance

Re: [PostgreSQL] équivalence du On KEY UPDATE

Posté : 20 août 2009, 22:28
par Rem73
J'ai continué mes recherches et à ce que je vois MERGE n'existe pas sur pgsql.

J'ai trouvé ceci dans la doc officiel :

Code : Tout sélectionner

CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS $$ BEGIN LOOP -- first try to update the key UPDATE db SET b = data WHERE a = key; IF found THEN RETURN; END IF; -- not there, so try to insert the key -- if someone else inserts the same key concurrently, -- we could get a unique-key failure BEGIN INSERT INTO db(a,b) VALUES (key, data); RETURN; EXCEPTION WHEN unique_violation THEN -- do nothing, and loop to try the UPDATE again END; END LOOP; END; $$ LANGUAGE plpgsql;
Cependant comment déclarer cette "fonction" (?) et comment l'utiliser par la suite.


Merci d'avance

Re: [PostgreSQL] équivalence du On KEY UPDATE

Posté : 20 août 2009, 23:49
par Rem73
Problème résolue.

La doc de postgreSQL m'a rendu un grand service. Et puis quelques cherche google. Au moins je saurais faire la prochaine fois :D

Merci quand même, vous m'avez déjà rendu service plus d'une fois et je vous suis reconnaisant ;)
Je pense que j'aurais attendu un peux et une âme généreuse serait venu, mais j'aime pas attendre ^^

Re: [PostgreSQL] équivalence du On KEY UPDATE

Posté : 21 août 2009, 09:14
par Berzemus
Ah oui, c'était rapide :wink: bravo pour avoir trouvé, tu posterais les liens vers la doc qui t'a sauvé pour si jamais quelqu'un d'autre rencontre le même problème ?

Re: [PostgreSQL] équivalence du On KEY UPDATE

Posté : 28 août 2009, 12:47
par Rem73
Oui biensur : http://www.postgresql.org/docs/current/ ... tures.html
Dans 38-2.
Il faut aussi crée le langage plpgsql. Il y a rien de compliquer c'est une requête SQL, je crois de mémoire. Une simple recherche devrais vous donner la solution très rapide (j'ai du trouver dans les premiers résultats).

Pour définir la fonction il suffit d'aller dans la console pgsql et puis le tour est jouer.

Bien entendu il faut modifier les requête SQL dans les conditions et aussi les arguments de la fonction pour que ça colle à ce que vous voulez faire.

J'espère que ça aidera certains ;)

EDIT : la chance la page qui décrit comment crée un langage était encore dans mes onglets donc voici la solution : createlang plpgsql <dbname>.