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 Général » Gestion de doublons » 11/01/2011 15:55:27

alain vanranst
Réponses : 1

Bonjour,

j'ai une table t_mc contenant les champs id, mc, ponderation, compteur.
Le champ mc contient des doublons que je souhaite eliminer.
Apres elimination des doublons, il ne reste donc qu'un seul enregistrement pour chaque valeur distincte du champ mc.
Mais, je souhaite pour chacun de ces enregistrement, que :
le champ compteur enregistre le nombre total d'enregistrement que j'avais par valeur de mc
le champ ponderation enregistre la somme des ponderations par valeur de mc.

Un exemple :
avant "nettoyage" :
id, mc, ponderation, compteur
1, m1, 8, 1
2, m1, 5, 1
3, m1, 4, 1
4, m2, 3, 1
5, m2, 5, 1
6, m2, 5, 1
7, m2, 5, 1
8, m3, 1, 1
9, m3, 7, 1

apres "nettoyage" :
id, mc, ponderation, compteur
10, m1, 17, 3
11, m2, 18, 4
12, m3, 8, 2

Est-il possible de réaliser cela en 1 opération sans passer par une table temporaire ?

Merci.

#2 Re : Général » INSERT + SELECT + constante » 11/01/2011 12:08:19

Voici :
INSERT INTO t_164 (mc_id, ponderation)
VALUES
(
(
SELECT pes.motsclefs_id
FROM t_a_theme as t, t_a_planete_ensigne_mc as pes
WHERE t.luns_id=pes.planetesigne_id AND t.theme_id=164
),
69
)

#3 Général » INSERT + SELECT + constante » 11/01/2011 11:40:38

alain vanranst
Réponses : 3

Bonjour,
soit une table t1 avec 2 champs c1 & c2
je souhaite effectuer un insert avec
pour c1 le resultat dun Select
pour c2 une constante
et, cela ne fonctionne pas (message : plus d'une ligne renvoyée par une sous-requête utilisée comme une expression)
J'ai détourné le probleme en passant par une table temporaire dans laquelle je fais l'insert puis l'update.
Question: est-ce possible d'effectuer cet INSERT en une seule operation ?

Merci.

#4 Re : Général » Erreur lors d'un dump » 21/04/2010 12:27:12

Bravo,
problème résolu et dump effectué.
Vous m'avez sorti d'un mauvais pas, un grand merci !

Si je puis me permettre, encore une ou 2 petites questions:

1. où trouver l'info pour comprendre le fonctionnement des tables système ?
certes, je n'y toucherai plus sur une base en prod ou en dev, mais je ne dis pas que sur une machine dédiée à l'aspect didactique ...

2. l'utilisation de Slony m'aurait-elle aidé ?


Encore merci.

Avr.

#5 Re : Général » Erreur lors d'un dump » 21/04/2010 10:31:51

Ne serait-ce pas pg_class que je dois updater ?

#6 Re : Général » Erreur lors d'un dump » 21/04/2010 10:29:58

Cela retourne :
ERREUR:  la colonne « reltriggers » de la relation « pg_trigger » n'existe pas

#7 Re : Général » Erreur lors d'un dump » 21/04/2010 10:17:42

Cette requête (select relname from pg_class where ...) me sort 2561 tables.

La requête que j'ai executée est :
DROP TRIGGER IF EXISTS triger_name ON table_name
celle-ci est incorporée à un script python qui boucle sur toutes les tables de la base (table_name est bien entendu une variable qui est remplacée par le nom des tables dans la boucle).

En fait, le triger que j'ai supprimé était encore utilisé par un grand nombre de table de la base.
Et c'est precisement là, je pense, ma principale erreur : je pensais l'avoir au préalablement remplacé par un autre triger.
Pour être plus précis encore, j'étais occupé à harmoniser la syntaxe de mes trigers et de mes fonctions, pour cela, je créais une nouvelle fonction avec la nouvelle syntaxe, je créais le nouveau triger avec la nouvelle syntaxe, je remplacais l'ancien triger par le nouveau dans les tables (via script python) et je supprimais ensuite l'ancienne fonction et l'ancien triger.
L'erreur vient du script pyhton, qui au lieu de boucler sur toutes les tables n'en a effectué qu'une partie du travail.
D'où la persistence de tables utilisant toujours l'ancien triger, que j'ai bêtement supprimé dans pg_triger.

J'espère ainsi avoir un peu mieux cerné l'historique du problème.

J'ai donc maintenant refait tourner le script python sur TOUTES les tables, et l'ancien triger ne devrait donc plus être présent dans aucune table.
Hélas le dump bloque toujours.
J'utilise donc votre requête (update pg_class set reltrigge ....) pour corriger le problème, table par table.

#8 Re : Général » Erreur lors d'un dump » 21/04/2010 09:01:55

Toujours pas de sauvegarde : pour l'instant, j'utilise votre requête (UPDATE pg_class SET ...) pour corriger le problème.
Si je lance le dump, il passe les tables 'nettoyées' et bloque sur la suivante non encore nettoyée.

Et comme je le disais, j'ai beaucoup de tables ...

Par contre mon raisonnement doit être erroné : pour rappel, j'ai supprimé dans pg_trigger un trigger qui utilisait une procedure que je souhaitais supprimer. Mais des tables font toujours reference à ce trigger !
Je pensais donc qu'en supprimant toutes references à ce trigger dans toutes les tables de la base cela corrigerait mon problème. J'ai donc ecrit et utilisé ceci sur toutes les tables de la base :
DROP TRIGGER IF EXISTS triger_name ON table_name.
Or, cela ne change rien : le dump bloque toujours sur les tables non nettoyées via votre requête !

Donc je continue à utiliser votre query.

Si vous avez une idée ...

#9 Re : Général » Erreur lors d'un dump » 20/04/2010 22:17:20

C'est effectivement la table pg_trigger que j'ai modifié :-(
Et, promis, je ne touche plus aux tables systèmes.


Ok compris pour relation=table, cela devient plus clair.


Pour supprimer la fonction, c'est tout simplment via l'interface de pgAdmin.


La requête que vous fournissez fonctionne, mais malheureusement, j'ai beaucoup de table à modifier. Je reviens donc à cette idée, existe-t-il un moyen de trouver les tables qui utilisent un trigger à partir du nom de ce dernier ? Cela me permettrait via une seule requête de supprimer ce trigger de ces tables.


En tous les cas, merci pour le coup de main.

#10 Re : Général » Erreur lors d'un dump » 20/04/2010 16:55:38

Ce message :
ERREUR:  2 trigger record(s) not found for relation "14209031MC"
veut-il bien dire que la table "14209031MC" possede 2 trigger qui "n'existent plus" ?

Dans ce message, la relation "14209031MC" est-ce bien une table ?

et donc, je reformule la question precedente :
est-il possible de connaitre le nom de cette table "14209031MC"

Suis-je sur la voie ou completement à côté?


Autr info, lorsque je réessaye de supprimer la fonction,  j'obtiens le message :
ERREUR:  could not find tuple for trigger 142177

#11 Re : Général » Erreur lors d'un dump » 20/04/2010 16:28:49

Si je vous suis, l'idée est de retrouver la table qui utilise le trigger qui a été supprimé (pour ensuite sans doute supprimer ce trigger de cette table) ?
Problème : je ne sais pas quelle table et j'ai 14430 tables dans cette base .
Existe-t-il un moyen (via les tables systemes par exemple) de retrouver les tables qui utilisent un trigger lorsqu'on connait le nom de celui-ci?

Je n'utilise pas (encore) Slony.

#12 Re : Général » Erreur lors d'un dump » 20/04/2010 16:02:43

Bonjour,

je suis sous Debian Lenny et c'est la postgres 8.3.9.

Merci pour votre aide.

Avr.

#13 Général » Erreur lors d'un dump » 20/04/2010 14:37:02

alain vanranst
Réponses : 18

Bonjour,
en essayant d'effectuer mon dump ce matin, j'obtiens ceci :
"
pg_dump: Message d'erreur du serveur : ERREUR:  2 trigger record(s) not found for relation "14209031MC"
pg_dump: La commande était : LOCK TABLE public."14209031MC" IN ACCESS SHARE MODE
"

Le probleme vient probablement d'une manipulation effectuée hier : ne sachant pas supprimer une fonction car elle était utilisée par un trigger, j'ai été dans la table trigger et ai supprimé directement le trigger en question. Bêtise or not?

Comment réparer ?


Merci pour votre aide.


Avr.

Pied de page des forums

Propulsé par FluxBB