У посібнику адміністраторів Oracle написано наступне:
Використовуйте оператор ALTER TABLE ... MODIFY для зміни існуючого визначення стовпця. Ви можете змінювати тип даних стовпців, значення за замовчуванням, обмеження стовпців, вираження стовпців (для віртуальних стовпців) та шифрування стовпців.
Ви можете збільшити довжину існуючого стовпця або зменшити його, якщо всі існуючі дані задовольняють новій довжині. Ви можете змінити стовпчик з байтової семантики на семантику CHAR або навпаки. Ви повинні встановити параметр ініціалізації BLANK_TRIMMING = TRUE, щоб зменшити довжину не порожнього стовпця CHAR.
Якщо ви змінюєте таблицю для збільшення довжини стовпця типу даних CHAR, розумійте, що це може зайняти багато часу і може зажадати значного додаткового зберігання, особливо якщо таблиця містить багато рядків. Це пояснюється тим, що значення CHAR у кожному рядку повинно бути заповнено порожнім кольором, щоб задовольнити нову довжину стовпця.
Oracle SQL Language Reference має набагато більше деталей , в тому числі такі:
Ви можете змінити тип даних будь-якого стовпця, якщо всі рядки стовпця містять нулі. Однак якщо ви змінюєте тип даних стовпця в таблиці контейнерів матеріалізованого перегляду, то база даних Oracle скасовує відповідне матеріалізоване подання.
Ви завжди можете збільшити розмір символу чи необробленого стовпця або точність числового стовпця, незалежно від того, містять чи не всі рядки нулі. Ви можете зменшити розмір типу даних стовпця до тих пір, поки для зміни не потрібно змінювати дані. База даних сканує наявні дані та повертає помилку, якщо є дані, що перевищують нову межу довжини.
Ви можете змінити стовпчик "ДАТА" на "TIMESTAMP" або "TIMESTAMP" з зоною місцевого часу. Ви можете змінити будь-яку TIMESTAMP З МІСЦЕВИМИ ЗОНАМИ В ТАБЛИЦІ ДАТИ.
Якщо таблиця порожня, ви можете збільшити або зменшити провідне поле або дробове друге значення стовпця часу або інтервалу. Якщо таблиця не порожня, ви можете лише збільшити переднє поле або дробову секунду стовпця дати або інтервалу.
Для стовпців CHAR і VARCHAR2 ви можете змінити семантику довжини, вказавши CHAR (вказати семантику символів для стовпця, який був спочатку вказаний у байтах) або BYTE (для позначення байтної семантики для стовпця, який був спочатку вказаний символами). Щоб дізнатись семантику довжин існуючих стовпців, запитайте стовпець CHAR_USED у вікні словника даних ALL_, USER_ або DBA_TAB_COLUMNS.
У наведеній документації є додаткова інформація та обмеження. Ось демонстрація спроб зменшити точність стовпця "Число" та зменшити довжину Varchar2. Ви можете спробувати інші зміни, щоб ви знали, що буде.
--Setup.
DROP TABLE FOO;
CREATE TABLE FOO (BAR Number, BAR2 VARCHAR2(300));
INSERT INTO FOO (SELECT Level, RPAD(to_char(Level),10*Level,to_char(Level))
FROM DUAL CONNECT BY Level <=20);
COMMIT;
SELECT * FROM FOO;
--Reduce Number to Number(10).
ALTER TABLE FOO MODIFY (BAR NUMBER (10));
--Reduce Varchar2(300) to Varchar2(100) (data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100));
--Reduce Varchar2(300) to Varchar2(200) (no data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(200));
Виписки alter мають такий вихід:
ALTER TABLE FOO MODIFY (BAR NUMBER (10))
Error report:
SQL Error: ORA-01440: column to be modified must be empty to decrease precision or scale
01440. 00000 - "column to be modified must be empty to decrease precision or scale"
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100))
Error report:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
01441. 00000 - "cannot decrease column length because some value is too big"
table FOO altered.
Зменшіть точність, створивши новий стовпець.
ALTER TABLE FOO ADD (BAR3 NUMBER(10));
UPDATE FOO SET Bar3 = Bar;
ALTER TABLE FOO DROP COLUMN BAR;
ALTER TABLE FOO RENAME COLUMN BAR3 TO BAR;