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