[Pgsql-ayuda] Cambio de tipo char a varchar

Alvaro Herrera alvherre@dcc.uchile.cl
Mon, 4 Aug 2003 21:06:50 -0400


On Mon, Aug 04, 2003 at 04:28:25PM -0400, Alfonso Andaur L. wrote:
> > Buenas ante todo quisiera saber si existe alguna manera de cambiar un
> > tipo de un campo, es decir, tengi un campo codigo que esta declarado
> > como char pero lo que deseo es que este sea varchar.

> 2. cambiando en nombre de tu campo a cualquier cosa (por ejemplo "basura") y
> luego crear el campo nuevamente pero según la definición correcta.

O botando el campo... (sólo en 7.3):
ALTER TABLE tabla DROP COLUMN columna-antigua

(pero naturalmente antes de eso se debe crear la nueva columna y copiar
los datos de una a otra).


En realidad hay otro mecanismo, más peligroso pero más sencillo:

alvh=# CREATE TABLE test (a char(25));
CREATE TABLE
alvh=# \d test
        Table "public.test"
 Column |     Type      | Modifiers 
--------+---------------+-----------
 a      | character(25) | 

alvh=# BEGIN;
BEGIN
alvh=# UPDATE pg_attribute SET atttypid='varchar'::regtype
       WHERE attrelid='test'::regclass AND attname='a';
UPDATE 1
alvh=# \d test
            Table "public.test"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 a      | character varying(25) | 

alvh=# UPDATE test SET a=a;
UPDATE
alvh=# SELECT a FROM test;		-- verificar que los datos
					-- estan OK
alvh=# COMMIT;
COMMIT
alvh=# VACUUM FULL test;
VACUUM

Hay que ser cuidadoso con no hacer estas cosas fuera de una transacción,
y no hacer COMMIT hasta no estar bien seguro de que el resultado es
correcto!! (i.e. si pierdes datos la culpa es tuya).

Mucho ojo, esto solo funciona con algunos tipos de datos, es decir no
trates de pasar una columna INTEGER a TEXT ni cosas similares.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Cuando mañana llegue pelearemos segun lo que mañana exija" (Mowgli)