Я использую следующий запрос:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
чтобы изменить тип данных столбца от character(20)
до numeric(10,0)
, но я получаю сообщение об ошибке:
"код" столбца не может быть введен для ввода числового
Вы можете попробовать USING
:
Необязательное предложение
USING
указывает, как вычислить новое значение столбца из старого; если опустить, преобразование по умолчанию такое же, как присваивание от старого типа данных к новому. ПредложениеUSING
должно быть предоставлено, если нет неявного или присваиваемого приведения от старого к новому типу.
Таким образом, это может работать (в зависимости от ваших данных):
alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);
Это не удастся, если у вас есть что-нибудь в code
, которое нельзя отнести к числовому; если ИСПОЛЬЗОВАНИЕ завершается с ошибкой, вам необходимо очистить нечисловые данные вручную, прежде чем изменять тип столбца.
Если ваш столбец VARCHAR
содержит пустые строки (которые не совпадают с NULL
для PostgreSQL, как вы могли бы вспомнить), вам нужно будет использовать что-то в строке ниже для установки значения по умолчанию:
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
(найденный с помощью этого ответа)