Nie ma niejawnego (automatycznego) rzutowania z text
lub varchar
do integer
(tj. Nie można przekazać a varchar
do funkcji oczekującej integer
lub przypisanej varchar
pola do integer
jedynki), więc należy określić jawne rzutowanie za pomocą ALTER TABLE ... ALTER COLUMN ... TYPE. .. UŻYWANIE :
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Zauważ, że możesz mieć spacje w polach tekstowych; w takim przypadku użyj:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
aby usunąć odstępy przed konwersją.
Powinno to wynikać z komunikatu o błędzie, jeśli polecenie zostało uruchomione psql
, ale możliwe, że PgAdmin-III nie pokazuje pełnego błędu. Oto, co się stanie, jeśli przetestuję go w psql
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ęki @muistooshort za dodanie USING
linku.
Zobacz także to powiązane pytanie ; chodzi o migracje Railsów, ale przyczyna jest taka 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 w tej kolumnie lub wartości domyślne kolumny mogą zakończyć się niepowodzeniem. Indeksy należy usunąć przed ALTER COLUMN i ponownie utworzyć po. Wartości domyślne należy odpowiednio zmienić.