Як змінити тип даних стовпця з символу на числовий в PostgreSQL 8.4


136

Я використовую такий запит:

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

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

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

Відповіді:


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 назад. У вас є тестова база даних, з якою можна грати, і резервна копія виробничої бази, правда?
mu занадто короткий

я видалив обмеження на зовнішній ключ, змінив тип даних, але після цього не зміг додати FK. Отримання наступної помилки ПОМИЛКА: вставлення або оновлення таблиці "рахунки-фактури" порушує обмеження іноземного ключа "invoice_presale_fk" ДЕТАЛІ: ключ (продаж, cpf_cnpj) = (4,05943560000101) відсутній у таблиці "передпродажні".
користувач728630

2
@funwhilelost Це приведення типу . Зв'язані документи ALTER TABLE охоплюють те, що ви можете використовувати з використанням.
mu занадто короткий

3
@muistooshort Я бачу з документів, що це насправді вираз. Це має більше сенсу. Типовий кидок зловив мене з остороги. Я закінчився зTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funtimelost

7

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

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

(знайдено за допомогою цієї відповіді )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.