Skip site navigation (1) Skip section navigation (2)

Re: forzar cambiar tipo de dato en una columna

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Juan Romero <jgromero(at)gmail(dot)com>
Cc: "Roberto A(dot)" <gedeon56(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: forzar cambiar tipo de dato en una columna
Date: 2010-03-30 00:46:04
Message-ID: 20100330004604.GE3925@alvh.no-ip.org (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Juan Romero escribió:
> 
> On Mar 29, 2010, at 5:36 PM, Roberto A. wrote:

> >alter table integrantes alter column ci type varchar(25);
> >
> >pero me da el siguiente mensaje de error
> >
> >ERROR:  foreign key constraint "proyecto_ci_fkey" cannot be
> >implemented
> >DETAIL:  Key columns "ci" and "ci" are of incompatible types:
> >character varying and integer.

> Como ya te imaginarás, lo que sucede es que tu columna de tipo
> entero no puede hacer un cast implícito a varchar(25). Según el
> manual podrías utilizar la cláusula USING... pero como a mi no me
> funcionó (quizás hice algo mal, por eso: [1]) opté, por lo otro que
> dice el manual: borrar constraints, modificar el tipo, y volver a
> crear los constraints.

Lo que pasa no es que necesite un USING (que sin duda es el error más
típico), sino que no se pueden tener llaves foráneas a columnas que
tengan tipos incompatibles.  Por eso el consejo que le diste más abajo
es correcto: debe botar la llave foránea y cambiar los tipos en las dos
tablas antes de poder volver a crear la llave foránea.

Nota: creo que es mejor hacer esto:

ALTER TABLE integrantes DROP CONSTRAINT proyecto_ci_fkey;

ALTER TABLE proyecto ALTER COLUMN id TYPE varchar(25);

ALTER TABLE integrantes ALTER COLUMN ci TYPE varchar(25),
     ADD CONSTRAINT proyecto_ci_fkey FOREIGN KEY (ci) REFERENCES integrantes;

Así la llave foránea se crea en la misma pasada en la que se cambia el
tipo de dato de la segunda columna, en vez de tener que recorrer la
tabla dos veces.  Si la tabla integrantes es grande, puede que ahorres
mucho tiempo.  (Obs: es posible que me equivoque; por favor verificar)

-- 
Alvaro Herrera	    Valdivia, Chile           Geotag: -39,815 -73,257
"When the proper man does nothing (wu-wei),
his thought is felt ten thousand miles." (Lao Tse)

In response to

pgsql-es-ayuda by date

Next:From: Roberto A.Date: 2010-03-30 11:22:16
Subject: problemas con current_time y current_Date
Previous:From: Juan RomeroDate: 2010-03-29 23:39:06
Subject: Re: forzar cambiar tipo de dato en una columna

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group