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

136

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

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

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

столбец "код" не может быть приведен к числовому типу

user728630
источник

Ответы:

241

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

мю слишком коротка
источник
этот столбец используется как внешний ключ в другой таблице, я думаю, мне придется изменить тип данных этого тоже?
user728630
2
@ user728630: Вам придется удалить FK, изменить оба столбца, а затем добавить FK обратно. У вас есть тестовая база данных и резервная копия рабочей базы данных, верно?
мю слишком коротко
я удалил ограничение внешнего ключа, изменил тип данных, но после этого не смог добавить FK. Получение следующей ошибки ОШИБКА: вставка или обновление таблицы «накладные» нарушает ограничение внешнего ключа «invoice_presale_fk» ДЕТАЛИ: Ключ (продажа, cpf_cnpj) = (4,05943560000101) отсутствует в таблице «предпродаж».
user728630
2
@funtimelost Это тип актерского состава . Связанные документы ALTER TABLE охватывают то, что вы можете использовать с помощью USING.
мю слишком коротка
3
@muistooshort Я вижу из документов это на самом деле выражение. Это имеет больше смысла. Шрифты застали меня врасплох. Я закончил сTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
fun whilelost
7

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

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

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

Патру
источник