powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как изменить тип столбца если в нём есть данные?
31 сообщений из 31, показаны все 2 страниц
Как изменить тип столбца если в нём есть данные?
    #36020415
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток!
Возможно ли изменить тип столбца, с NUMBER на VARCHAR2, если столбец не пустой?

Делаю:
Код: plaintext
1.
ALTER TABLE TABLE_NAME
MODIFY(DOC_NO VARCHAR2( 250 ));
Пишет:
Код: plaintext
ORA- 01439 : модифицируемый столбец при смене типа данных должен быть пуст
Как можно это обойти, и возможно ли вообще?

Спасибо!
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020436
Alexey181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как вариант
Код: plaintext
1.
2.
3.
4.
create table tab1 as select * from tab where  0 = 1 ;
ALTER TABLE tab1
MODIFY(col1 VARCHAR2( 250 ));
insert into tab1 select * from tab;
commit;
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020440
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_
Код: plaintext
ORA- 01439 : модифицируемый столбец при смене типа данных должен быть пуст
Как можно это обойти, и возможно ли вообще?Ведь по-русски же написано.
Сохраняешь, обнуляешь, модифицируешь столбец, восстанавливаешь. Либо переименовываешь, добавляешь, переносишь, удаляешь старый солбец.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020455
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey181как вариант
Код: plaintext
1.
2.
3.
4.
create table tab1 as select * from tab where  0 = 1 ;
ALTER TABLE tab1
MODIFY(col1 VARCHAR2( 250 ));
insert into tab1 select * from tab;
commit;


Да, а потом ещё
Код: plaintext
drop table tab;
и
Код: plaintext
rename tab1 to tab;
Это конечно хороший варриант, но таблиц слишком много, хотелось бы как-нибудь по проще сделать, если такое конечно возможно...
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020460
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicСохраняешь, обнуляешь, модифицируешь столбец, восстанавливаешь. Либо переименовываешь, добавляешь, переносишь, удаляешь старый солбец.
Хотелось без лишних заморочек сделать...
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020473
Alexey181
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_MOD_IF_Y_ElicСохраняешь, обнуляешь, модифицируешь столбец, восстанавливаешь. Либо переименовываешь, добавляешь, переносишь, удаляешь старый солбец.
Хотелось без лишних заморочек сделать...
exp/imp в помощь
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020483
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_Хотелось без лишних заморочек сделать..."Поздно пить боржоми, когда..." :)
Думать надо было во время дизайна.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020489
_MOD_IF_Y_
Хотелось без лишних заморочек сделать...
"сим салабим" ептить скажи только громче и несколько раз.

если кто-то изначально не думает, то потом сам дурак.

авторexp/imp в помощь
думаю у товарища красненького только добавится
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020504
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic"Поздно пить боржоми, когда..." :)
Думать надо было во время дизайна.
Дизайном не я занимался, мне просто сказали: "А номер документа может быть не только нумбер, так что займись ка ты сменой типов..."
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020603
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_Elic"Поздно пить боржоми, когда..." :)
Думать надо было во время дизайна.
Дизайном не я занимался, мне просто сказали: "А номер документа может быть не только нумбер, так что займись ка ты сменой типов..."
Естественный ключ?
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020610
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey.LЕстественный ключ?
Извиняюсь, но я не совсем понял вопрос...
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020615
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_Andrey.LЕстественный ключ?
Извиняюсь, но я не совсем понял вопрос...Ссылочная целостность обеспечивается по номеру документа.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020629
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey.LСсылочная целостность обеспечивается по номеру документа.
Поле нот нулл, но ссылочной целостности нет.
Сейчас делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table tab1 as (select * from tab);

ALTER TABLE tab
MODIFY("No"  NULL);

update tab set "No" = null;

ALTER TABLE tab
MODIFY("No" VARCHAR2( 250 ));

update tab set "No" = (SELECT "No" from tab1 where tab1."ObjectGUID" = tab."ObjectGUID"); 

drop table tab1;

ALTER TABLE tab
MODIFY("No"  NOT NULL);
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020643
SQLap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_ но ссылочной целостности нет.


Это хорошо, что нет)
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020650
Andrey.L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_Andrey.LСсылочная целостность обеспечивается по номеру документа.
Поле нот нулл, но ссылочной целостности нет.
Сейчас делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table tab1 as (select * from tab);

ALTER TABLE tab
MODIFY("No"  NULL);

update tab set "No" = null;

ALTER TABLE tab
MODIFY("No" VARCHAR2( 250 ));

update tab set "No" = (SELECT "No" from tab1 where tab1."ObjectGUID" = tab."ObjectGUID"); 

drop table tab1;

ALTER TABLE tab
MODIFY("No"  NOT NULL);
По-моему сильно много телодвижений...
Упрости...
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020665
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!
Таблиц оказалось не так уж и много(23)... сделал так как описал выше.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36020742
ZVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_,

Это у вас таблички маленькие и работа пользователей по боку... :)

А вообще есть более спортивные варианты:

Код: plaintext
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.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
SQL*Plus: Release  9 . 2 . 0 . 8 . 0  - Production on Tue Jun  2   10 : 17 : 16   2009 

Copyright (c)  1982 ,  2002 , Oracle Corporation.  All rights reserved.

Connected to:
Oracle Database 10g Enterprise Edition Release  10 . 2 . 0 . 3 . 0  - Production
With the Partitioning, OLAP and Data Mining options

SQL> Create Table "неверная"
   2   ("столбец" Number)
   3   /

Table created.

SQL> Insert Into "неверная"
   2      Select     rownum /  2 
   3            From dual
   4      Connect By Level <  11 
   5   /

 10  rows created.

SQL> Select *
   2     From "неверная"
   3   /

   столбец                                                                      
----------                                                                      
        . 5                                                                       
          1                                                                       
        1 . 5                                                                       
          2                                                                       
        2 . 5                                                                       
          3                                                                       
        3 . 5                                                                       
          4                                                                       
        4 . 5                                                                       
          5                                                                       

 10  rows selected.

SQL> Drop Table "верная"
   2   /
Drop Table "верная"
           *
ERROR at line  1 :
ORA- 00942 : table or view does not exist 


SQL> Create Table "верная"
   2   ("столбец" Varchar( 10 ))
   3   /

Table created.

SQL> 
SQL> Begin
   2      dbms_redefinition.Can_redef_table ( Uname                         => User
   3                                         ,Tname                         => '"неверная"'
   4                                         ,Options_flag                  => dbms_redefinition.Cons_use_rowid
   5                                        );
   6   End;
   7   /

PL/SQL procedure successfully completed.

SQL> 
SQL> Begin
   2      dbms_redefinition.Start_redef_table ( Uname                         => User
   3                                           ,Orig_table                    => '"неверная"'
   4                                           ,Int_table                     => '"верная"'
   5                                           ,Options_flag                  => dbms_redefinition.Cons_use_rowid
   6                                           ,Col_mapping                   => 'to_char("столбец") "столбец"'
   7                                          );
   8   End;
   9   /

PL/SQL procedure successfully completed.

SQL> 
SQL> Rem COPY_TABLE_DEPENDENTS при необходимости...
SQL> 
SQL> Begin
   2      dbms_redefinition.Finish_redef_table ( Uname                         => User,
   3                                             Orig_table                    => '"неверная"'
   4                                            ,Int_table                     => '"верная"' );
   5   End;
   6   /

PL/SQL procedure successfully completed.

SQL> Drop Table "верная"
   2   /

Table dropped.

SQL> desc "неверная";
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 столбец                                            VARCHAR2( 10 )

SQL> Select *
   2     From "неверная"
   3   /

столбец                                                                         
----------                                                                      
. 5                                                                               
 1                                                                                
 1 . 5                                                                              
 2                                                                                
 2 . 5                                                                              
 3                                                                                
 3 . 5                                                                              
 4                                                                                
 4 . 5                                                                              
 5                                                                                

 10  rows selected.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36021185
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZVVА вообще есть более спортивные варианты:

Спасибо за решение!
Попробовал ваш варриант с вашими таблицами, всё проходит хорошо, когда пытаюсь сделать на своих после прогона
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL*Plus: Release  9 . 2 . 0 . 8 . 0  - Production on Tue Jun  2   10 : 17 : 16   2009 
SQL> Begin
   2      dbms_redefinition.Start_redef_table ( Uname                         => User
   3                                           ,Orig_table                    => 'tab'
   4                                           ,Int_table                     => 'test_tab'
   5                                           ,Options_flag                  => dbms_redefinition.Cons_use_rowid
   6                                           ,Col_mapping                   => 'to_char("No") "No"'
   7                                          );
   8   End;
   9   /
пишет:
Код: plaintext
1.
2.
3.
4.
5.
6.
ORA- 12091 : невозможно интерактивно переопределить таблицу tab с материализованными представлениями
ORA- 06512 : на  "SYS.DBMS_REDEFINITION", line  8 
ORA- 06512 : на  "SYS.DBMS_REDEFINITION", line  146 
ORA- 06512 : на  line  1 

Begin dbms_redefinition.Start_redef_table ( Uname                         => User,
                                            Orig_table   
test_tab создаю следующим образом:
Код: plaintext
create table test_tab as (select * from tab where  0 = 1 );
Затем делаю:
Код: plaintext
1.
ALTER TABLE test_tab
MODIFY("No"  VARCHAR2( 250  char));
Почему выходит ошибка?
Спасибо!
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36021465
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_,
автор
Код: plaintext
ORA- 12091 : невозможно интерактивно переопределить таблицу tab с материализованными представлениями

Что в ошибке из написанного русским языком непонятно? Нельзя переопределить таблицу, если на ней основываются материализованные представления. Если всё равно хоцца - грохаем матвью и матлоги, переопределяем, создаём матвью и матлоги заново.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36025075
_MOD_IF_Y_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLerЧто в ошибке из написанного русским языком непонятно?
Не понятно то, что нет никаких матвью-шек привязанных к этой таблице.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36025143
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_MOD_IF_Y_,

как определяем?
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #36025171
Фотография DВА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и логов тоже нет?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как изменить тип столбца если в нём есть данные?
    #40112985
VIVIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех.
Столкнулся со схожей проблемой: нужно изменить number на varchar2 и добавить длину поля на 4 разряда, поле используется как естественный ключ. По постановке только последние 3 разряда могут принимать буквенные значения. В основной таблице, порядка 200 тысяч записей, в таблице где используется поле как ключ порядка 20 миллионов записей (накопили за 12 лет).
Про "думать заранее" тут не подходит, системе 20 лет и всё работало как часы, а тут заставляют "синхронизировать" справочники с новой системой, аргументы что "лучше у них там переделать" не работают - бизнесу удобнее как там.
Приведённый выше код скорее всего сработает, но я опасаюсь, что время исполнения может оказаться неприемлемо долгим, а мы можем остановить систему максимум на 2 дня в выходные.
Есть идеи как обойтись без конвертации или ускорить процесс?
Подумываю сделать отдельную таблицу для маппинга буквенных кодов в цифровые и в интерфейсе подменять, но основная идея минимально переписывать GUI.
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #40112991
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIVIM

Столкнулся со схожей проблемой: нужно изменить number на varchar2 и добавить длину поля на 4 разряда, поле используется как естественный ключ.


Использование естественных ключей раньше или позже аукается. Я бы просто добавил поле в родительскую таблицу и навесил на нее UNIQUE INDEX и продолжал использовать существующее поле.

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

Даже париться не стоит.
Ладно бы 20 ярдов записей - еще было бы о чем говорить, но два дня на 20 лямов - овердофига.
Даже dbms_redefinition привлекать смысла особого нет.
Табличка секционированная или нет?
Свободное место в БД на копию есть?
...
Рейтинг: 0 / 0
Как изменить тип столбца если в нём есть данные?
    #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
31 сообщений из 31, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как изменить тип столбца если в нём есть данные?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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