2010-05-21 12 views
6

Tengo una columna con el tipo de Varchar en mi base de datos de Postgres que quise decir que era enteros ... y ahora quiero cambiarlos, lamentablemente esto no parece trabajo usando mi migración de rieles.Cómo convertir una columna de tabla a otro tipo de datos

change_column :table1, :columnB, :integer 

que parece salida de este SQL:

ALTER TABLE table1 ALTER COLUMN columnB TYPE integer 

así que he intentado hacer esto:

execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)' 

pero fundido no funciona en este caso debido a que algunos de la columna son nulos ...

¿Alguna idea?

error:

PGError: ERROR: invalid input syntax for integer: "" 
: ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER) 

Postgres v8.3

+0

la versión de postgres está usando? eso funciona para mí – ealdent

+0

por cierto: ¿qué exactamente no funciona con la migración? –

Respuesta

13

Parece que el problema es que tiene cadenas vacías en su mesa. Tendrá que manejar los, probablemente con una declaración del caso, tales como:

execute %{ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST(CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}

Actualización: reescrito por completo basado en cuestión actualizada.

+0

Saqué las comillas, y traté de usar fusionar pero solo obtengo "PGError: ERROR: columna" 0 "no existe" – holden

2

NULLs no debería ser un problema aquí. Cuéntenos su versión de postgresql y su mensaje de error. Además, ¿por qué estás citando identificadores? Tenga en cuenta que los identificadores sin comillas se convierten a minúsculas (comportamiento predeterminado), por lo que puede haber un problema con su "columna B" en la consulta: aparece citado primero, sin comillas en el molde.

Actualización: Antes de convertir una columna en número entero, debe asegurarse de que todos sus valores sean convertibles. En este caso, significa que columnB debe contener solo dígitos (o null). Esto se puede comprobar por algo así como

select columnB from table where not columnB ~ E'^[0-9]+$'; 

Si desea que sus cadenas vacías a ser convertidos a NULL enteros, a continuación, ejecute primero

UPDATE table set columnB = NULL WHERE columnB = ''; 
+0

Última versión de postgresql es 8.4.4 – leonbloy

+0

lo siento, quise decir 8.3 (postgresql83) ;-) – holden

Cuestiones relacionadas