powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переопределение primary key для таблицы
25 сообщений из 26, страница 1 из 2
Переопределение primary key для таблицы
    #32163927
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была создана таблица командой

Код: plaintext
1.
2.
3.
4.
create table dept
(id number( 10 ) primary key,
name varchar2( 40 ),
...
);


В таблице есть данные и есть внешние ключи ссылающиеся на ее PK.

Хотелось бы - создать индекс для PK в специально предназначенном для этого табличном пространстве (index_ts), дать свое имя индексу и констрейнту.

Какова последовательность комманд для корректного и безпроблемного осуществления этих преобразований.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32163931
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Грохнуть этот констрейнт
2. alter table add constraint ... primary key(..., ...) using index (...). Индекс получит имя констрейнта.

Ещё вариант 0 - проверить, никто ли своим foreign key-ем не цепляет PK, который ты будешь убивать.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32163952
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице есть данные и есть внешние ключи ссылающиеся на ее PK.

То есть тогда

1) грохнуть foreign key констрейнты на этот PK
2) грохнуть РК
3) alter table add constraint ... primary key(..., ...) using index (...)
4) создать foreign keys заново
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32163959
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, верно. Я в спешке не заметил подробностей про FK. Знаешь, как получить список всех ссылающихся FK?
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32163961
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если только перенести, без переименования, попробуй это:
alter index <имя> rebuild tablespace <имя нужно табличной области>

Имя индекса из:
select
CONSTRAINT_NAME
from
dba_constraints
where
owner=UPPER('таблица') and
constraint_type = UPPER('P')
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32163970
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * from user_dependencies;

Заморочки конечно, а еще во всех книгах советуют делай мол

create table dept
(id number(10) primary key,
...

А нельзя ли просто сказать что то типа

alter table ... MODIFY CONSTRAINT ... use index ...

чтобы сказать чтобы для PK использовался некий заранее созданный индекс?

Можно ли с помощью

alter table ... MODIFY CONSTRAINT

переименовать констрейнт?

PS
В доке смотрела там такие диаграммы, в них час надо разбираться....
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32163974
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А переименовать можно хакерским способом:

Код: plaintext
1.
 update sys.con$ set name='новое имя'  where name = 'имя';
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164023
Vladimir_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно примерно так (в пакете)

type tFKConstr is record ( table_name dba_tables.table_name%type,
constr_name dba_constraints.constraint_name%type,
field_list varchar2(254),
pk_fields varchar2(254),
pk_table dba_tables.table_name%type,
pk_constr dba_constraints.constraint_name%type,
enabled boolean := true,
cascade boolean := false );
-- таблица по заданной структуре
type tFKConstrList is table of tFKConstr index by binary_integer;
-- список ограничений
FKConstrList tFKConstrList;
...
procedure ConstrFK_Off( tn in varchar2, isDelete in boolean default false )
is
i integer;
begin
-- удаляем все записи
FKConstrList.delete;
-- заполняем массив
for curConstr in ( select c1.table_name,
c1.constraint_name,
c1.delete_rule,
c1.status,
c1.r_constraint_name
from dba_constraints c1, dba_constraints c2
where c2.owner = owner_
and c2.table_name = upper(tn)
and c1.constraint_type = 'R'
and c1.r_owner = c2.owner
and c1.r_constraint_name = c2.constraint_name ) loop
i := FKConstrList.count + 1;
--
FKConstrList(i).table_name := curConstr.table_name;
FKConstrList(i).constr_name := curConstr.constraint_name;
FKConstrList(i).field_list := Get_Constr_Fields(curConstr.constraint_name);
FKConstrList(i).pk_table := upper(tn);
FKConstrList(i).pk_fields := Get_Constr_Fields(curConstr.r_constraint_name);
FKConstrList(i).pk_constr := curConstr.r_constraint_name;
--
if curConstr.status = 'DISABLED' then
FKConstrList(i).enabled := false;
end if;
--
if curConstr.delete_rule = 'CASCADE' then
FKConstrList(i).cascade := true;
end if;
--
end loop;
-- отключаем все работающие ограничения
if FKConstrList.count > 0 then
for i in 1..FKConstrList.count loop
if isDelete then
ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '||
'drop constraint '||FKConstrList(i).constr_name );
else
if FKConstrList(i).Enabled then
ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '||
'disable constraint '||FKConstrList(i).constr_name );
end if;
end if;
end loop;
end if;
--
end;
-- включаем ограничения для пересоздания первичного ключа
-- или создаём заново
procedure ConstrFK_On( tn in varchar2, isCreate in boolean default false )
is
begin
-- проверяем наличие записей для включения ограничений
if FKConstrList.count > 0 then
-- включаем все работавшие ограничения
for i in 1..FKConstrList.count loop
if FKConstrList(i).pk_table = upper(tn) then
if isCreate then
ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '||
'add constraint '||FKConstrList(i).constr_name||' foreign key ('||
FKConstrList(i).field_list||') '||cr||
' references '||owner_||'.'||FKConstrList(i).pk_table||'('||
FKConstrList(i).pk_fields||') '||
iif(FKConstrList(i).cascade,'on delete cascade ','')||
iif(FKConstrList(i).Enabled,'','disable') );
else
if FKConstrList(i).Enabled then
ExecSQL( 'alter table '||owner_||'.'||FKConstrList(i).table_name||' '||
'enable constraint '||FKConstrList(i).constr_name );
end if;
end if;
end if;
end loop;
end if;
--
FKConstrList.delete;
--
end;
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164028
Vladimir_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прощения, что не сохранил форматирование, могу попробовать повторить с форматированием
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164044
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Vladimir

Спасибо. Текст я и так смогу сохранить сохранить, может в будущем пригодится.

to softbuilder

А переименовать можно хакерским способом:

В 9.2 можно

alter table ... RENAME CONSTRAINT old_name TO new_name;
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164049
Vladimir Demkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.Сделайте disable всех форенкиев ссылающихся на этот первичный ключ.
2. Сделайте disable первичного ключа: alter table dept disable primary key;
3. Создайте индекс по тем же полям, что и в первичном ключе
CREATE INDEX ИМЯ_ИНДЕКСА ON dept(id) tablespace ИМЯ_ТАБЛЭСПАЙСА;
4. Сделайте alter table dept enable primary key;
5. Произведите активизацию FK выключенных в п.1
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164079
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"В 9.2 можно
alter table ... RENAME CONSTRAINT old_name TO new_name;"

Я пока не перешёл на 9i и не собираюсь.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164085
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to softbuilder

В 9.2 можно ... - это я так для информации, вдруг кому понадобится.

Я пока не перешёл на 9i и не собираюсь.

В этом высказывании усматриваю недовольство 9 кой. Или мне кажется?
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164088
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164099
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно быстро выключить PK и связанные FK так:
alter table xxx disable primary key cascade;

Затем PK включается с созданием индекса в нужном разделе:
alter table xxx enable constraint cccc using index tablespace ttttt;

К сожалению, включать FK придется по одному.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164120
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"В этом высказывании усматриваю недовольство 9 кой. Или мне кажется?"

Ты знаешь, что RDTEX например еще поддерживает клиентов на Oracle 6?

Интересно что эти клиенты ответят, если задать твой вопрос
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164143
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запинают наверное:-)

Ладно всем спасибо, закрываем тему.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164159
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как закрываем? А результы моих исследований?
Код: 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.
SQL> 
SQL> set echo on;
SQL> set termout on;
SQL> 
SQL> connect test;
Connected.
SQL> 
SQL> alter table emp drop primary key;

Table altered.

SQL> 
SQL> alter table emp add primary key (empno)
   2    using index tablespace indx;

Table altered.

SQL> 
SQL> select
   2    index_name,
   3    tablespace_name
   4   from
   5    user_indexes
   6   where
   7    table_name='EMP' ;

INDEX_NAME                     TABLESPACE_NAME                                                      
 ------------------------------ ------------------------------                                       
 
SYS_C00774                     INDX                                                                 

SQL> 
SQL> select
   2    constraint_name
   3   from
   4    user_constraints
   5   where
   6    table_name='EMP' and
   7    constraint_type = 'P' ;

CONSTRAINT_NAME                                                                                     
 ------------------------------                                                                      
 
SYS_C00774                                                                                          

SQL> 
SQL> 
SQL> col cname new_value v_cname;
SQL> 
SQL> select constraint_name cname from user_constraints where
 table_name='EMP' and constraint_type='P';

CNAME                                                                                               
 ------------------------------                                                                      
 
SYS_C00774                                                                                          

SQL> 
SQL> alter index &&v_cname rebuild tablespace indx2;
old    1 : alter index &&v_cname rebuild tablespace indx2
new    1 : alter index SYS_C00774 rebuild tablespace indx2

Index altered.

SQL> 
SQL> connect / as sysdba;
Connected.
SQL> 
SQL> update sys.con$ set name = 'emp_pk' where name = '&&v_cname';
old    1 : update sys.con$ set name = 'emp_pk' where name = '&&v_cname'
new    1 : update sys.con$ set name = 'emp_pk' where name = 'SYS_C00774'

 1  row updated.

SQL> 
SQL> update sys.obj$ set name = 'emp_pk' where name = '&&v_cname';
old    1 : update sys.obj$ set name = 'emp_pk' where name = '&&v_cname'
new    1 : update sys.obj$ set name = 'emp_pk' where name = 'SYS_C00774'

 1  row updated.

SQL> 
SQL> connect test;
Connected.
SQL> 
SQL> select
   2    index_name,
   3    tablespace_name
   4   from
   5    user_indexes
   6   where
   7    table_name='EMP' ;

INDEX_NAME                     TABLESPACE_NAME                                                      
 ------------------------------ ------------------------------                                       
 
emp_pk                         INDX2                                                                

SQL> 
SQL> select
   2    constraint_name
   3   from
   4    user_constraints
   5   where
   6    table_name='EMP' and
   7    constraint_type = 'P' ;

CONSTRAINT_NAME                                                                                     
 ------------------------------                                                                      
 
emp_pk                                                                                              

SQL> 
SQL> Input truncated to  10  characters
spool off;


Как ты хотела и tablespace и имя.

Вот только с foreign key я не проверял.

Попробуй сама.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164180
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to softbuilder

Я ограничилась вашим советом

alter index <имя> rebuild tablespace <имя нужно табличной области>

быстро и не надо ничего удалять и пересоздавать.

переименовывать что-то в sys.con$ я не решилась:-)

Совет Al'а тоже занесла в свой knowledge base.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164187
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Violina:
Вобщем-то правильно, если в 9i есть специальная команда "alter table ... RENAME CONSTRAINT old_name TO new_name;" то конечно лучше использовать её.
А кстати а команда для изменении имени индекса в 9i есть?
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164203
AI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 softbuilder & ALL

Не рекомендую обращаться в техсаппорт с вопросом: "я тут сделал update sys.props$ set xxxx where aaaa; после чего база перестала запускаться". Там скажут, что для доступа в словарь существуют команды DDL, а прямой доступ категорически не рекомендуется за исключением рекомендаций самого саппорта.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164209
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я упустил один момент. Дело в том что при использовании
alter index <имя> rebuild tablespace <имя нужно табличной области>
происходит блокировка исходного индекса.

Поэтому для уменьшения влияния блокировки нужно использовать опцию online:
alter index <имя> rebuild tablespace <имя нужно табличной области> online
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164213
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AI: я в курсе.

К счастью мы отказалтсь от саппорта.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164217
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему "к счастью"??? Кстати, rebuild online не во всех случаях можно сделать.
...
Рейтинг: 0 / 0
Переопределение primary key для таблицы
    #32164220
Violina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для уменьшения влияния блокировки нужно использовать опцию online

т.е. чтобы можно было делать insert и delete во время пересоздания индекса?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переопределение primary key для таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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