Изменить тип поля varchar на integer: "невозможно автоматически привести к типу integer"

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

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

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

7 ответов


нет неявного (автоматического) приведения из text или varchar до integer (т. е. вы не можете пройти varchar к функции, ожидающей integer и назначить


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

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

chnged to

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

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

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

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


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


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

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


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

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

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

UPDATE table_mame SET field_name= 0;

после этого выполнить запрос ниже и после успешного выполнения запроса, к schemamigration и после этого запустить сценарий миграции.

ALTER TABLE table_mame ALTER COLUMN field_name тип числовой (10,0) используя field_name:: numeric;

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