Няма имплицитно (автоматично) предаване от text или varchar към integer (т.е. не можете да предадете varchar към функция, която очаква integer или задайте varchar поле към integer едно), така че трябва да посочите изрично предаване с помощта на ALTER TABLE ... ALTER COLUMN ... TYPE ... ИЗПОЛЗВАНЕ:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (col_name::integer);
Имайте предвид, че може да имате празно пространство в текстовите полета; в този случай използвайте:
ALTER TABLE the_table ALTER COLUMN col_name TYPE integer USING (trim(col_name)::integer);
за премахване на бялото пространство преди конвертиране.
Това би трябвало да е очевидно от съобщение за грешка, ако командата е била изпълнена в psql , но е възможно PgAdmin-III да не ви показва пълната грешка. Ето какво се случва, ако го тествам в 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
Благодаря @muistooshort за добавянето на USING връзка.
Вижте също този свързан въпрос; става дума за миграции на Rails, но основната причина е същата и отговорът е приложим.
Ако грешката все още се появява, тогава тя може да не е свързана със стойности на колони, но индексите над тази колона или стойностите по подразбиране на колона може да не успеят да присвоят типа. Индексите трябва да бъдат премахнати преди ALTER COLUMN и да бъдат пресъздадени след това. Стойностите по подразбиране трябва да бъдат променени по подходящ начин.