Не существует неявного (автоматического) приведения из 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 и воссозданы после. Значения по умолчанию должны быть изменены соответствующим образом.