Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Как изменить тип столбца если в нём есть данные?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
create table dropme_t(somekey int, payload varchar2(100char));
Table created
Executed in 0.062 seconds

insert --+ append
  into dropme_t
with t as (select 1 from dual connect by level <= ceil(sqrt(20e6)))
select rownum, rpad('a',100,'a')
  from t,t
;
20007729 rows inserted
Executed in 17.757 seconds

commit;
Commit complete
Executed in 0.07 seconds

-- Пробуем поменять тип:
alter table dropme_t modify (somekey varchar2(100))

ORA-01439: column to be modified must be empty to change datatype

-- Пользуясь двухдневным окном, начинаем развлекаться:
-- 1. создадим partitioned табличку, под которой подержим данные до окончания 
-- длииииинной операции переопределения:
create table dropme_t_interim partition by range(somekey) (partition p1 values less than (maxvalue)) as select * from dropme_t where 1=0;
Table created
Executed in 0.077 seconds

-- 2. Сдвинем в неё данные
alter table dropme_t_interim exchange partition p1 with table dropme_t including indexes without validation;
Table altered
Executed in 0.107 seconds

-- 3. Модифицируем оригинал

alter table dropme_t modify (somekey varchar2(100)); 
Table altered
Executed in 0.064 seconds

-- 4. Длииинная Обратная Заливка
-- Вот тут потребуется место под копию
insert into dropme_t select * from dropme_t_interim;
20007729 rows inserted
Executed in 12.166 seconds

-- 5. Чистим за собой.
drop table dropme_t_interim purge;
Table dropped
Executed in 0.204 seconds

desc dropme_t
Name    Type               Nullable Default Comments 
------- ------------------ -------- ------- -------- 
SOMEKEY VARCHAR2(100)      Y                         
PAYLOAD VARCHAR2(100 CHAR) Y                         

select count(*) from dropme_t;

  COUNT(*)
----------
  20007729

Executed in 1.116 seconds
SQL> 
19 ноя 21, 18:39    [22398096]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить тип столбца если в нём есть данные?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10337
andrey_anonymous,

Не забудь добавить partitioning опция дополнительная и платная.

SY.
19 ноя 21, 19:04    [22398109]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить тип столбца если в нём есть данные?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10337
andrey_anonymous,

Если partitioning недоступен expdp, truncate, modify, impdp самый быстрый способ.

SY.
19 ноя 21, 19:09    [22398112]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить тип столбца если в нём есть данные?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
SY
Если partitioning недоступен expdp, truncate, modify, impdp самый быстрый способ.

Ну CTAS-то никто не отменял...
Просто показал не самый очевидный способ - немного извращённый, как я люблю :)

Сообщение было отредактировано: 19 ноя 21, 19:21
19 ноя 21, 19:17    [22398119]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить тип столбца если в нём есть данные?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10337
Тут еще "поле используется как естественный ключ", т.е. предполагаются дочерние таблицы которые также придется менять - расплата за использование естественных ключей. Так-что если возможно я бы добавил поле в родительскую таблицу засунул бы в существующие строки TO_CHAR("естественный ключ") и навесил на нее UNIQUE INDEX и продолжал использовать существующее "естественный ключ" поле но уже как искусственный ключ создав последовательность с START WITH MAX("естественный ключ") + 1.

SY.
19 ноя 21, 19:35    [22398128]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить тип столбца если в нём есть данные?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
SY
если возможно я бы добавил поле в родительскую таблицу

Если возможно - то да, это самый оптимальный метод синхронизации ключей под задачи интеграции.
19 ноя 21, 19:39    [22398132]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Oracle Ответить