2010-05-21 14 views
6

Mam kolumnę z typem Varchar w mojej bazie danych PostgreSQL, która miała być liczbą całkowitą ... i teraz chcę je zmienić, niestety nie wydaje mi się pracuję z wykorzystaniem mojej migracji railsów.Jak przekonwertować kolumnę tabeli na inny typ danych

change_column :table1, :columnB, :integer 

co wydaje się wyjście to SQL:

ALTER TABLE table1 ALTER COLUMN columnB TYPE integer 

więc próbowałem to zrobić:

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

ale obsada nie działa w tym przypadku, ponieważ niektóre kolumny są nieważne ...

jakieś pomysły?

Błąd:

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

Postgres v8.3

+0

która wersja PostgreSQL używasz? to działa dla mnie – ealdent

+0

btw: co dokładnie nie działa z migracją? –

Odpowiedz

13

Brzmi jak problem jest to, że masz pustych strun w tabeli. trzeba obsłużyć tych, prawdopodobnie z oświadczeniem sprawy, takich jak:

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

Aktualizacja: całkowicie przepisany na podstawie zaktualizowanego pytanie.

+0

Wyciągnąłem cytaty i próbowałem używać koalescencji, ale dostaję tylko "PGError: BŁĄD: kolumna" 0 "nie istnieje" – holden

2

NULL nie powinno stanowić problemu. Powiedz nam swoją wersję postgresql i komunikat o błędzie. Poza tym, dlaczego cytujesz identyfikatory? Pamiętaj, że niecytowane identyfikatory są konwertowane na małe litery (zachowanie domyślne), więc w zapytaniu może być problem z twoją kolumnąB - pojawia się ona najpierw cytowana, niecytowana w rzutowaniu.

Aktualizacja: Przed konwersją kolumny na liczbę całkowitą należy upewnić się, że wszystkie wartości są zamienne. W tym przypadku oznacza to, że kolumna B powinna zawierać tylko cyfry (lub zero). Można to sprawdzić przez coś podobnego

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

Jeśli chcesz, aby puste ciągi są konwertowane na NULL liczb całkowitych, a następnie uruchomić pierwszy

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

Ostatnia wersja Postgresql to 8.4.4 – leonbloy

+0

Przepraszam, miałem na myśli 8.3 (postgresql83) ;-) – holden

Powiązane problemy