Re: Conversion d'une colonne text vers integer

Lists: pgsql-fr-generale
From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Conversion d'une colonne text vers integer
Date: 2009-09-26 09:23:48
Message-ID: 1253957028.4451.3.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Bonjour à tous,

Pour des questions de performances et taille, j'ai une colonne "colonne"
dans ma base de données qui contient des valeurs varchar(50) et des
NULL.

Je les ai convertie avec une fonction schema.uniqueValue qui retourne
l'ID de la valeur dans une table "valeurs" :

UPDATE schema.matable SET colonne = schema.uniqueValue(colonne) WHERE
colonne IS NOT NULL;

Maintenant, je n'ai que des valeurs sous formes d'entiers et des NULL.
Je voudrais donc changer le type de ma colonne pour "integer". Or, quand
je fait:

ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer;

J'ai l'erreur:

ERREUR: la colonne « colonne » ne peut pas être convertie vers le type
pg_catalog.int4

Il y a-t-il une autre méthode de faire ?

Merci d'avance !
Cordialement, Samuel.


From: Stéphane Bunel <stephane+pgfr(at)bpf(dot)st>
To: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Conversion d'une colonne text vers integer
Date: 2009-09-26 09:31:14
Message-ID: 4ABDDF62.3090905@bpf.st
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Samuel ROZE a écrit :
> Bonjour à tous,
>
> Pour des questions de performances et taille, j'ai une colonne "colonne"
> dans ma base de données qui contient des valeurs varchar(50) et des
> NULL.
>
> Je les ai convertie avec une fonction schema.uniqueValue qui retourne
> l'ID de la valeur dans une table "valeurs" :
>
> UPDATE schema.matable SET colonne = schema.uniqueValue(colonne) WHERE
> colonne IS NOT NULL;
>
> Maintenant, je n'ai que des valeurs sous formes d'entiers et des NULL.
> Je voudrais donc changer le type de ma colonne pour "integer". Or, quand
> je fait:
>
> ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer;
>
> J'ai l'erreur:
>
> ERREUR: la colonne « colonne » ne peut pas être convertie vers le type
> pg_catalog.int4
>
> Il y a-t-il une autre méthode de faire ?

Oui, "à l'ancienne"

1. Créer une colonne temporaire de type entier
2. Copier les données de la 1er colonne vers la seconde en appliquant
une conversion de type.
3. Détruire la 1er colonne après moult et moult vérifications
4. Renommer la colonne temporaire qui viendra prendre la place de
l'ancienne.

Y a sûrement mieux aujourd'hui ! Mais ça fonctionne encore.

Stéphane.


From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: stephane+pgfr(at)bpf(dot)st
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Conversion d'une colonne text vers integer
Date: 2009-09-26 09:38:23
Message-ID: 1253957903.4451.4.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Hé bien s'il n'y a que ça, c'est ce que je vais faire :-)

Merci !

Le samedi 26 septembre 2009 à 11:31 +0200, Stéphane Bunel a écrit :
> Samuel ROZE a écrit :
> > Bonjour à tous,
> >
> > Pour des questions de performances et taille, j'ai une colonne "colonne"
> > dans ma base de données qui contient des valeurs varchar(50) et des
> > NULL.
> >
> > Je les ai convertie avec une fonction schema.uniqueValue qui retourne
> > l'ID de la valeur dans une table "valeurs" :
> >
> > UPDATE schema.matable SET colonne = schema.uniqueValue(colonne) WHERE
> > colonne IS NOT NULL;
> >
> > Maintenant, je n'ai que des valeurs sous formes d'entiers et des NULL.
> > Je voudrais donc changer le type de ma colonne pour "integer". Or, quand
> > je fait:
> >
> > ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer;
> >
> > J'ai l'erreur:
> >
> > ERREUR: la colonne « colonne » ne peut pas être convertie vers le type
> > pg_catalog.int4
> >
> > Il y a-t-il une autre méthode de faire ?
>
> Oui, "à l'ancienne"
>
> 1. Créer une colonne temporaire de type entier
> 2. Copier les données de la 1er colonne vers la seconde en appliquant
> une conversion de type.
> 3. Détruire la 1er colonne après moult et moult vérifications
> 4. Renommer la colonne temporaire qui viendra prendre la place de
> l'ancienne.
>
> Y a sûrement mieux aujourd'hui ! Mais ça fonctionne encore.
>
> Stéphane.
>


From: "Daniel Verite" <daniel(at)manitou-mail(dot)org>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Conversion d'une colonne text vers integer
Date: 2009-09-26 11:22:09
Message-ID: 67e49f70-e5e7-46e0-8517-efa85864b2da@mm
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Samuel ROZE wrote:

> ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer;
>
> J'ai l'erreur:
>
> ERREUR: la colonne « colonne » ne peut pas être convertie vers le type
> pg_catalog.int4
>
> Il y a-t-il une autre méthode de faire ?

ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer
USING colonne::integer;

Cordialement,
--
Daniel


From: Samuel ROZE <samuel(dot)roze(at)aliceadsl(dot)fr>
To: Daniel Verite <daniel(at)manitou-mail(dot)org>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Conversion d'une colonne text vers integer
Date: 2009-09-26 11:28:37
Message-ID: 1253964517.3622.0.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

Génial !
Merci!

Le samedi 26 septembre 2009 à 13:22 +0200, Daniel Verite a écrit :
> Samuel ROZE wrote:
>
> > ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer;
> >
> > J'ai l'erreur:
> >
> > ERREUR: la colonne « colonne » ne peut pas être convertie vers le type
> > pg_catalog.int4
> >
> > Il y a-t-il une autre méthode de faire ?
>
> ALTER TABLE schema.matable ALTER COLUMN colonne TYPE integer
> USING colonne::integer;
>
> Cordialement,
> --
> Daniel
>