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


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

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

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

7 123

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.

обновить table_mame SET field_name= 0;

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

ALTER TABLE table_mame ALTER COLUMN field_name тип numeric (10,0) с помощью field_name:: numeric;

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