Изменение точности числового столбца в Oracle
В настоящее время у меня есть столбец, объявленный как НОМЕР. Я хочу изменить точность столбца на NUMBER (14,2).
SO, я выполнил команду
alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)'
для которого я получил сообщение об ошибке:
column to be modified must be empty to decrease precision or scale
Я предполагаю, что он хочет, чтобы столбец был пуст, пока он меняет точность, и я не знаю, почему он говорит, что мы хотим уменьшить его, пока мы его увеличиваем, данные в столбцах не могут быть потеряны. Есть ли короткий способ обхода? Я не хочу копировать его в другую таблицу и затем отбрасывать ее или переименовывать столбец и копировать между столбцами, потому что существует риск потери данных между передачами и падениями.
Ответы
Ответ 1
Предполагая, что вы не задали точность изначально, она считается максимальной (38). Вы уменьшаете точность, потому что вы меняете ее с 38 до 14.
Самый простой способ справиться с этим - переименовать столбец, скопировать данные и затем удалить исходный столбец:
alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD;
alter table EVAPP_FEES add AMOUNT NUMBER(14,2);
update EVAPP_FEES set AMOUNT = AMOUNT_OLD;
alter table EVAPP_FEES drop column AMOUNT_OLD;
Если вы действительно хотите сохранить порядок столбцов, вы можете переместить данные дважды:
alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);
update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;
update EVAPP_FEES set AMOUNT = null;
alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);
update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;
alter table EVAPP_FEES drop column AMOUNT_TEMP;
Ответ 2
Установив масштаб, вы уменьшите точность. Попробуйте NUMBER (16,2).
Ответ 3
Если таблица сжата, это будет работать:
alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);
update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;
update EVAPP_FEES set AMOUNT = null;
alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);
update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;
alter table EVAPP_FEES move nocompress;
alter table EVAPP_FEES drop column AMOUNT_TEMP;
alter table EVAPP_FEES compress;