Pudieras agregar a esa tabla una nueva columna, que inicialmente aceptará
valores nulos y de tipo bigint, entonces desde un procedimiento almacenado
copias o mueves los valores desde la columna que tiene el varchar hasta la que
tendrá los números telefónicos, una vez que los hayas copiado todos, la pones
que no acepte nulos y creas tu índice, acá te dejo un pequeño ejemplo que te
puede servir. Saludos.
------------------------------------------------------------------------------
CREATE TABLE public.tabla_a (
pk_tabla_a BIGSERIAL,
valor_a VARCHAR NOT NULL,
valor_a_entero BIGINT,
CONSTRAINT tabla_a_pkey PRIMARY KEY(pk_tabla_a)
) WITHOUT OIDS;
-------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION public.fun_mover_a_entero (
)
RETURNS boolean AS
$body$
DECLARE
iterator tabla_a%ROWTYPE;
BEGIN
FOR iterator IN SELECT * FROM tabla_a
Loop
UPDATE tabla_a
SET
valor_a_entero = CAST(iterator.valor_a AS BIGINT)
WHERE
pk_tabla_a = iterator.pk_tabla_a;
END Loop;
RETURN TRUE;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
-----Mensaje original-----
De: [email protected]
[mailto:[email protected]] En nombre de Adrian Misael Peña
Montero
Enviado el: jueves, 22 de septiembre de 2011 09:52
Para: Lisibeth Troconis
CC: postgreSQL
Asunto: Re: [pgsql-es-ayuda] Consulta sobre modificación de tipo en un campo
El ALTER no lo puede hacer de VARCHAR a BIGINT, pero de BIGINT a VARCHAR sí,
valora el costo de realizar el ALTER en la segunda tabla que mencionas.
Saludos
----- Mensaje original -----
De: "Lisibeth Troconis" <[email protected]>
Para: "postgreSQL" <[email protected]>
Enviados: Jueves, 22 de Septiembre 2011 9:16:04 GMT -04:30 Caracas
Asunto: [pgsql-es-ayuda] Consulta sobre modificación de tipo en un campo
Saludos!
Necesito por favor saber si puedo cambiar un tipo de dato character varchar(50)
a bigint sin perder los datos que tengo
ALTER TABLE mensajes ALTER COLUMN prefijo TYPE bigint
Poniéndolos en contexto tengo una tabla mensaje que guarda un número telefónico
formato internacional ejemplo 58261xxxxxxx , por razones que siempre pasa al
momento de diseñar la base de datos no se pensó que en algún momento se
quisiera realizar la consulta sobre esta tabla, sobre el prefijo, osea no
interesa el número completo, realizar esta consulta sobre la tabla resulta muy
costosa, pues posee demasiados registros, la opción que pensamos fue crear un
campo adicional y realizar el siguiente query
update mensaje set prefijo=
(select num from Prefijo where mensaje.dest like num || '%' limit 1)
where mensaje.id in (
select m.id from mensaje m where m.refproveedor is not null and m.prefijo is
null
limit 5000
)
se realizo el cambio en un script por segmentos de 5000 mil registros cada vez
pero pequeño detalle, al agregar la columna la agregamos como character
varchar(50) pues parecía lo lógico ya que en la tabla mensaje el numero se
almacena en un character varchar(255), pero resulta que tenemos otra tabla
donde se tienen los prefijos y en esta tabla el prefijo es un bitint
bueno el punto es que por los momentos quiero convertir este campo, para luego
hacer el indice y realizar comparaciones contra esta otra tabla sin tener
muchos líos
La pregunta en concreto es esa, como realizar el cambio sin perder los datos, y
cualquier otro aporte que me de luz al respecto de lo que deseo hacer
muchas gracias! espero respuestas =)
--
Lisibeth Troconis
-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda
-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda