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