Измените тип поля varchar на integer: "нельзя автоматически использовать для ввода целого числа"

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

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

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

Ответ 1

Нет неявного (автоматического) перевода из 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, но основная причина - то же самое и ответ применяется.

Ответ 2

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

изменить столбец 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)'

Ответ 3

Вы можете сделать это как:

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

или попробуйте это:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

Если вы хотите узнать больше об этой теме, прочитайте эту статью: https://kolosek.com/rails-change-database-column

Ответ 4

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

При написании 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)'

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

Ответ 5

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

Ответ 6

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

UPDATE the_table SET col_name = replace(col_name, 'some_string', '');

Ответ 7

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

UPDATE table_mame SET field_name= 0;

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

ALTER TABLE table_mame ALTER COLUMN field_name TYPE numeric(10,0) USING field_name::numeric;

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