Vous n'êtes pas identifié(e).
Pages : 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.
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
)
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.
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.
Ne serait-ce pas pg_class que je dois updater ?
Cela retourne :
ERREUR: la colonne « reltriggers » de la relation « pg_trigger » n'existe pas
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.
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 ...
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.
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
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.
Bonjour,
je suis sous Debian Lenny et c'est la postgres 8.3.9.
Merci pour votre aide.
Avr.
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.
Pages : 1