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

10 réponses

1 2
Avatar
Antoine Dinimant
Yvon Thoraval a écrit:
dans ma bd j'ai mal nommé deux séquences, comment faire pour les
renommer en gardant le lien avec l'id ?



je n'ai guère d'aide à t'apporter, par contre je ne voudrais pas perdre
une occasion de m'instruire : qu'est-ce qu'une séquence ?
Avatar
yvon.thoravalNO-SPAM
Antoine Dinimant wrote:


je n'ai guère d'aide à t'apporter, par contre je ne voudrais pas perdre
une occasion de m'instruire : qu'est-ce qu'une séquence ?



Avec postgreSQL, il n'y a pas d'auto-incrémentation des index, il faut
créer une séquence :
CREATE SEQUENCE public.ma_sequence_seq INCREMENT 1 MINVALUE 1
MAXVALUE 2147483647 CACHE 1;

puis l'utilser :

CREATE TABLE public.ma_table (
mon_id int4 DEFAULT nextval('"ma_sequence_seq"'::text) NOT NULL,
texte_bidon varchar(50) NOT NULL,
CONSTRAINT ma_table_pkey PRIMARY KEY (mon_id)
) WITH OIDS;

j'avoue ne pas avoir pigé pourquoi l'auto-incrémentation n'a pas été
implémentée....
il doit y avoir des choses plus difficiles à faire sur PostgreSQL...
--
yt
Avatar
Antoine Dinimant
merci pour l'info !
Avatar
Etienne SOBOLE
"Yvon Thoraval" a écrit dans le message de
news: 1gdw5yi.1obguy0105qwvoN%
dans ma bd j'ai mal nommé deux séquences, comment faire pour les
renommer en gardant le lien avec l'id ?



soit:
tu fais un pg_dump
puis tu edites le fichier....
et apres tu reinstalle ta base.

soit tu te connecte en tant que postgres
sur le base template1
et la je sais plus trop dans quelle tables les infos sont stockées, mais
elles sont quelques part :)
tu trouveras sans doute dans le doc de postgresql.

Etienne
Avatar
yvon.thoravalNO-SPAM
Etienne SOBOLE wrote:

et la je sais plus trop dans quelle tables les infos sont stockées, mais
elles sont quelques part :)
tu trouveras sans doute dans le doc de postgresql.



ce que je pense faire :

renommer la colonne *_id -> *_id_old ;
(re)créer la colonne *_id en copiant les bons id ;
créer une séquence avec le bon nom et l'attribuer à *_id ;
après verif, drop anything unused ;)
--
yt
Avatar
Patrick
Avec postgreSQL, il n'y a pas d'auto-incrémentation des index, il faut
créer une séquence :



CREATE SEQUENCE public.ma_sequence_seq;
suffit pour les valeurs par défaut.

puis l'utilser :

CREATE TABLE public.ma_table (
mon_id int4 DEFAULT nextval('"ma_sequence_seq"'::text) NOT NULL,
texte_bidon varchar(50) NOT NULL,
CONSTRAINT ma_table_pkey PRIMARY KEY (mon_id) ) WITH OIDS;

j'avoue ne pas avoir pigé pourquoi l'auto-incrémentation n'a pas été
implémentée....



Cf le type SERIAL (qui créé une séquence).

Patrick.
Avatar
Patrick
le problème est que je veux retrouver :

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



SELECT setval('squence_name',lavaleurquevousvoulez);

Patrick.
Avatar
Banoît Barbier
On Sun, 16 May 2004 18:42:55 +0200
(Yvon Thoraval) wrote:

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



Bonjour,
Je ferais :

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;

Mais il faut modifier la structure de la table (je suppose que vous
utilisez postgresql):

Avant tout un pgdump voir le man pour sauvegarder uniquement le
contenu de t_language_lang et pas sa structure. Et un de la base en
entier(structure et données) pour être sûr! ;)

Ensuite modifier l'id après avoir droppé la table:
CREATE TABLE t_language_lang
(
lang_id INT4 DEFAULT NEXTVAL('t-language_seq') PRIMARY KEY,
...

Ensuite avec la commande COPY (voir la doc) importer le fichier crée
par pgdump.


Ou bien un :

ALTER TABLE [ ONLY ] table [ * ]
ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }

!!!Si il y a des tables hérités...Elles utilisent la même séquence.



Benoît

Ps.
Voici un extrait de la CHARTE DU FORUM fr.comp.applications.sgbd

Étant donné le grand nombre de S.G.B.D. existant, pour les questions
relatives à un produit spécifique, il est recommandé de positionner
des balises pertinentes dans le sujet, en précisant les numéros de
versions dans le corps de l'article.

Exemples de [BALISES] :
[Oracle][AIX]
[SQL]
[Objet]
[Merise]
[Designer/2000][WinNT]
[Progress][DBA]
[DB2]
etc.

Raison : il n'existe pas de forum dédié aux discussions sur les bases
de données.

[PostgreSQL]le vrais l'unique! ;)
Avatar
Banoît Barbier
On Sun, 16 May 2004 18:42:55 +0200
(Yvon Thoraval) wrote:

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' ;




Bonjour,
Je ferais :

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;

Mais il faut modifier la structure de la table (je suppose que vous
utilisez postgresql):

Avant tout un pgdump voir le man pour sauvegarder uniquement le
contenu de t_language_lang et pas sa structure. Et un de la base en
entier(structure et données) pour être sûr! ;)

Ensuite modifier l'id après avoir droppé la table:
CREATE TABLE t_language_lang
(
lang_id INT4 DEFAULT NEXTVAL('t-language_seq') PRIMARY KEY,
...

Ensuite avec la commande COPY (voir la doc) importer le fichier crée
par pgdump.

!!!Si il y a des tables hérités...Elles utilisent la même séquence.


Benoît

Ps.
Voici un extrait de la CHARTE DU FORUM fr.comp.applications.sgbd

Étant donné le grand nombre de S.G.B.D. existant, pour les questions
relatives à un produit spécifique, il est recommandé de positionner
des balises pertinentes dans le sujet, en précisant les numéros de
versions dans le corps de l'article.

Exemples de [BALISES] :
[Oracle][AIX]
[SQL]
[Objet]
[Merise]
[Designer/2000][WinNT]
[Progress][DBA]
[DB2]
etc.

Raison : il n'existe pas de forum dédié aux discussions sur les bases
de données.
Avatar
yvon.thoravalNO-SPAM
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...
--
yt
1 2