OVH Cloud OVH Cloud

renommer une séquence

13 réponses
Avatar
yvon.thoravalNO-SPAM
dans ma bd j'ai mal nommé deux séquences, comment faire pour les
renommer en gardant le lien avec l'id ?

exemple :

table : t_language_lang
id : lang_id
seq : t-language_seq (au lieu de t_language_lang_seq)

le problème est que je veux retrouver :

select currval('Sequence_name'); (donc retrouver la valeur du dernier
id)

après avoir retrouvé le nom de la séquence par :

SELECT relname FROM pg_class where relname ~ '^t_language_lang' and
relkind = 'S' ;

je souhaite cela car les arguments passés à mon prog contiennent déjà le
nom de la table...
--
yt

3 réponses

1 2
Avatar
Banoît Barbier
On Fri, 21 May 2004 18:39:30 +0200
(Yvon Thoraval) wrote:

Banoît Barbier wrote:

> SELECT max(lang_id) t_language_lang;
> --Va renvoyer une valeur n
>
> DROP SEQUENCE t_language_lang_seq;
> CREATE SEQUENCE t-language_seq START n+1;

oui, c'est bien sur PostgreSQL...

il ne veut pas droper l'ancienne séquence, pourtant c'est bien la
nouvelle qui est prise en compte car, le n , je l'ai arrondi à la
centaine supérieure, histoire de vérifier, par l'id qu'elle était
bien prise en compte.

si j'essaie de retrouver, par pg_class qu'elle la séquence attribuée
à cette colonne, je retoruve l'ancienne...



Pour retrouver le nom d'une séquence utilisée par une table il y a
plus facile:

d nom_de_la_table

?

d TABLE describe table (or view, index, sequence)

Que donne cette commande?

ou d sans argument pour connaître toutes les tables(séquences
comprises) de la BD.

Benoît
Avatar
yvon.thoravalNO-SPAM
Banoît Barbier wrote:

Pour retrouver le nom d'une séquence utilisée par une table il y a
plus facile:

d nom_de_la_table



Oui, merci beaucoup pour ta pertinente remarque comme je suis la tête
dans le guidon java j'oublie qu'en cli, tout est si simple :)))

donc le résultat :

macave=# d t_appellations_alt
Table "public.t_appellations_alt"
Column | Type |
Modifiers
-----------+-----------------------+------------------------------------
-----------------------------
alt_id | integer | not null default
nextval('t_appellations_alt_alt_id_seq'::text)
reg_id | integer |
wcol_id | integer |
alt_desc | character varying(64) | not null default ''::character
varying
alt_notes | text |
Indexes:
"t_appelations_alt_pkey" primary key, btree (alt_id)
"t_appelations_alt_alt_desc_key" unique, btree (alt_desc)


donc la nouvelle séquence avec la bonne orthographe a bien été prise en
compte...

il n'y a que les _pkeys qui sont mal orthographiées

en fait je voudrais retourner la valeur du dernier "alt_id" (par
exemple) après une insertion, depuis java, j'ai essayé le "select
MAX(mon_id) from table machin" ça marche tant que non paramétré, si je
fais :

string = "mon_id";
sql = "select MAX(" + string + ") from table machin ;" ;

avec exactement le même "mon_id", ça ne me retourne rien, pas même une
erreur...

alors comme déjà ce n'est pas très élégant de faire ça je voudrais faire
:

select currval('t_appellations_alt_alt_id_seq') ;

mais, comme je ne sais pas retrouver (par java, pas en cli où c'est
facile) 't_appellations_alt_alt_id_seq' à partir de 'alt_id' (mais ça
doit-être possible...) il faut absolument que mes noms de cols et tables
soient corrects de telle manière que je puisse créer la string :
't_appellations_alt_alt_id_seq' à partir de :

't_appellations_alt' et de :
'alt_id' car je ne veux pas avoir de hash table qui me donne la séquence
en fonction de l'id (maintenance oblige)


l'idéal, pour moi, étant de retrouver le nom de la colonne séquence à
partir du nom de la colonne id et de "pg_attrdef", "pg_attribute" et de
"pg_class" (ou autres) ce qui rendrait mon appli indépendante du choix
des noms et donc accessoirement de mes fotes d'aurtograffes...



--
yt
Avatar
yvon.thoravalNO-SPAM
Banoît Barbier wrote:


Pour retrouver le nom d'une séquence utilisée par une table il y a
plus facile:



Bon finalement j'ai trouvé le select qui permet de retrouver
l'association col_id et sequence :

SELECT attname, adsrc FROM pg_attrdef, pg_attribute WHERE
((pg_attrdef.adnum = pg_attribute.attnum) and (pg_attrdef.adrelid pg_attribute.attrelid) and (pg_attrdef.adsrc ~ 't_bottles_btl'));

qui donne :

attname adsrc
---------- ------------------------------------------------
btl_id nextval('public.t_bottles_btl_btl_id_seq'::text)


MAIS je n'ai pas trouvé comment relier le nom d'une colonne au nom de la
table par l'intermédiaire de attrelid ou adrelid càd le n° de la
table...
--
yt
1 2