Изменить тип поля 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.
обновить table_mame SET field_name= 0;
после этого, чтобы запустить запрос ниже и после успешного выполнения запроса, к schemamigration и после этого запустить сценарий миграции.
ALTER TABLE table_mame ALTER COLUMN field_name тип numeric (10,0) с помощью field_name:: numeric;
Я думаю, что это поможет вам.