Nie ma niejawnego (automatycznego) rzutowania z text
lub varchar
na integer
(tj. nie możesz przekazać varchar
do funkcji oczekującej integer
lub przypisz varchar
pole na integer
jeden), więc musisz określić jawne rzutowanie za pomocą ALTER TABLE ... ALTER COLUMN ... TYPE ... USING:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Zauważ, że możesz mieć białe znaki w swoich polach tekstowych; w takim przypadku użyj:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
usunąć białe znaki przed konwersją.
To powinno być oczywiste z komunikatu o błędzie, jeśli polecenie zostało uruchomione w psql
, ale możliwe, że PgAdmin-III nie pokazuje pełnego błędu. Oto, co się stanie, jeśli przetestuję go w psql
na PostgreSQL 9.2:
=> CREATE TABLE test( x varchar );
CREATE TABLE
=> insert into test(x) values ('14'), (' 42 ');
INSERT 0 2
=> ALTER TABLE test ALTER COLUMN x TYPE integer;
ERROR: column "x" cannot be cast automatically to type integer
HINT: Specify a USING expression to perform the conversion.
=> ALTER TABLE test ALTER COLUMN x TYPE integer USING (trim(x)::integer);
ALTER TABLE
Dziękujemy @muistooshort za dodanie USING
link.
Zobacz także to powiązane pytanie; chodzi o migracje Railsów, ale podstawowa przyczyna jest ta sama i odpowiedź ma zastosowanie.
Jeśli błąd nadal występuje, może to być związane nie z wartościami kolumn, ale indeksy nad tą kolumną lub wartościami domyślnymi kolumny mogą zakończyć się niepowodzeniem rzutowania typu. Indeksy muszą zostać usunięte przed ALTER COLUMN i ponownie utworzone po. Wartości domyślne należy odpowiednio zmienić.