Изменить тип поля 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;
Я думаю, это поможет вам.