Измените тип поля varchar на integer: «не может быть автоматически приведен к типу integer»

108

У меня есть небольшая таблица, и определенное поле содержит тип ", отличающийся". Я пытаюсь изменить его на " Integer", но он дает ошибку, что кастинг невозможен.

Есть ли способ обойти это или я должен просто создать другую таблицу и принести записи в нее с помощью запроса.

Поле содержит только целые значения.

  • 0
    Какой конкретный ALTER TABLE вы пробовали и какое конкретное сообщение об ошибке?
  • 0
    @muistooshort Я пытался использовать alter из phppgadmin. Выделил столбец и попытался ввести новый тип поля. Ошибка: SQL error: ERROR: column "MID" cannot be cast to type integer
Показать ещё 5 комментариев
Теги:
casting
postgresql-9.1
fieldtype

6 ответов

155
Лучший ответ

Нет неявного (автоматического) перевода из text или varchar в integer (т.е. вы не можете передать varchar функции, ожидающей integer, или назначьте поле varchar для integer one), поэтому вы должны указать явное преобразование, используя 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, но основная причина - то же самое и ответ применяется.

  • 0
    Спасибо, что нашли время. Но я не могу заставить это работать. Я попробовал вашу строку ALTER, и она выдает ошибку «Синтаксическая ошибка рядом с использованием»
  • 0
    Мое утверждение: ALTER TABLE "tblMenus" ALTER COLUMN "MID" USING (trim ("MID") :: integer);
Показать ещё 8 комментариев
51

этот работал у меня.

изменить столбец varchar на int

change_column :table_name, :column_name, :integer

получил:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

привязан к

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
  • 0
    Вы пробовали это упражнение с данными и ваши данные были целы?
  • 3
    до тех пор, пока в столбце есть целое число, да
Показать ещё 4 комментария
6

Попробуйте это, это сработает наверняка.

При написании Rails-миграций для преобразования столбца строки в целое число, которое вы обычно говорите:

change_column :table_name, :column_name, :integer

Однако PostgreSQL будет жаловаться:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

"Подсказка" в основном говорит вам, что вам нужно подтвердить, что вы хотите, чтобы это произошло, и как данные должны быть преобразованы. Просто скажите это в своей миграции:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

Вышеупомянутое будет имитировать то, что вы знаете из других адаптеров баз данных. Если у вас есть нечисловые данные, результаты могут быть неожиданными (но вы все равно конвертируете в целое число).

  • 0
    Я просто хотел добавить еще один момент, будьте осторожны с change_column. это необратимо Я предлагаю использовать вверх и вниз при миграции, чтобы сделать это обратимым.
1

У меня такая же проблема. Чем я понял, у меня было строковое значение по умолчанию для столбца, который я пытался изменить. При удалении значения по умолчанию ошибка исчезла:)

0

Если вы работаете над средой разработки (или для того, чтобы ее можно было запустить, это может быть резервное копирование ваших данных), сначала очистите данные из поля БД или установите значение как 0.

UPDATE table_mame SET field_name = 0;

После этого для запуска нижеприведенного запроса и после успешного запуска запроса, к схематизации и после этого выполните миграцию script.

ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric (10,0) ИСПОЛЬЗОВАНИЕ field_name:: numeric;

Я думаю, это поможет вам.

0

Если вы случайно или не смешали целые числа с текстовыми данными, вы должны сначала выполнить команду обновления (если не выше таблицы alter не получится):

UPDATE the_table SET col_name = replace(col_name, 'some_string', '');
  • 2
    Вам лучше использовать что-то вроде regexp_replace(col_name, '[^0-9.]','','g') если вы пытаетесь удалить нежелательные символы и пробелы. Вам нужно что-то более сложное, если вы хотите сохранить научные нотации NaN и Inf и 10E42 .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню