powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как изменить тип столбца если в нём есть данные?
6 сообщений из 31, страница 2 из 2
Как изменить тип столбца если в нём есть данные?
    #40113206
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
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> 
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #40113212
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

SY.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #40113213
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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

SY.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #40113217
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Если partitioning недоступен expdp, truncate, modify, impdp самый быстрый способ.

Ну CTAS-то никто не отменял...
Просто показал не самый очевидный способ - немного извращённый, как я люблю :)
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #40113223
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут еще "поле используется как естественный ключ", т.е. предполагаются дочерние таблицы которые также придется менять - расплата за использование естественных ключей. Так-что если возможно я бы добавил поле в родительскую таблицу засунул бы в существующие строки TO_CHAR("естественный ключ") и навесил на нее UNIQUE INDEX и продолжал использовать существующее "естественный ключ" поле но уже как искусственный ключ создав последовательность с START WITH MAX("естественный ключ") + 1.

SY.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #40113227
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
если возможно я бы добавил поле в родительскую таблицу

Если возможно - то да, это самый оптимальный метод синхронизации ключей под задачи интеграции.
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как изменить тип столбца если в нём есть данные?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]