PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/09/2009 14:08:36

nGuinet
Membre

Imbriquer un update dans un insert ?

Est-il possible d'imbriquer un update dans un insert grâce à un returning * ?

exemple :

insert into table1 (update table2 set .... where .... returning *)

Cet exemple me renvoi une erreur sur "set".

En faite je cherche un moyen facile  d'insérer des lignes modifiées par une commande update dans une table tierce.

Avez-vous une idée ?

Merci.

Hors ligne

#2 15/09/2009 15:02:11

Marc Cousin
Membre

Re : Imbriquer un update dans un insert ?

Apparemment ça n'est pas possible : http://archives.postgresql.org/pgsql-ge … g00805.php
(à moins que ça n'ait changé, mais je n'en ai pas l'impression)

Un trigger pourrait le faire, mais ça serait en place en permanence, pas juste pour une requête ponctuelle.


Marc.

Hors ligne

#3 15/09/2009 19:16:05

gleu
Administrateur

Re : Imbriquer un update dans un insert ?

Réponse un peu plus affirmative : non, ce n'est pas possible. Quelques discussions ont eu lieu pour permettre cela pour la future 8.5, mais rien n'est fait pour l'instant.


Guillaume.

Hors ligne

#4 20/09/2009 11:18:55

nGuinet
Membre

Re : Imbriquer un update dans un insert ?

Merci pour vos réponses.

J'ai utilisé le trigger suivant pour résoudre ce problème :

-- table1 : table pour insertion
-- table2 : table à updater

CREATE OR REPLACE FUNCTION process_add_updated() RETURNS TRIGGER AS $table2$
	DECLARE
	BEGIN
		IF (TG_OP = 'UPDATE') THEN
			INSERT INTO table1 SELECT NEW.*;
			 RETURN NEW;
		END IF;
		RETURN NULL; -- result is ignored since this is an AFTER trigger
	END;
$table2$ LANGUAGE plpgsql;
												
CREATE TRIGGER add_updated
	AFTER UPDATE ON table2
       FOR EACH ROW EXECUTE PROCEDURE process_add_updated();

Pour utiliser ce trigger il faut installer le langage plpgsql. (tuto : http://docs.postgresqlfr.org/8.1/xplang.html)

Dernière modification par nGuinet (20/09/2009 11:22:17)

Hors ligne

Pied de page des forums