Как изменить тип данных столбца с символьного на числовой в PostgreSQL 8.4

101

Я использую следующий запрос:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

чтобы изменить тип данных столбца от character(20) до numeric(10,0), но я получаю сообщение об ошибке:

"код" столбца не может быть введен для ввода числового

Теги:

2 ответа

190
Лучший ответ

Вы можете попробовать 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, которое нельзя отнести к числовому; если ИСПОЛЬЗОВАНИЕ завершается с ошибкой, вам необходимо очистить нечисловые данные вручную, прежде чем изменять тип столбца.

  • 0
    этот столбец используется как внешний ключ в другой таблице, я думаю, мне придется изменить тип данных этого тоже?
  • 1
    @ user728630: Вам придется удалить FK, изменить оба столбца, а затем добавить FK обратно. У вас есть тестовая база данных и резервная копия рабочей базы данных, верно?
Показать ещё 6 комментариев
0

Если ваш столбец VARCHAR содержит пустые строки (которые не совпадают с NULL для PostgreSQL, как вы могли бы вспомнить), вам нужно будет использовать что-то в строке ниже для установки значения по умолчанию:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

(найденный с помощью этого ответа)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню