Няма имплицитно (автоматично) предаване от 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 и да бъдат пресъздадени след това. Стойностите по подразбиране трябва да бъдат променени по подходящ начин.