powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему не работает "enable novalidate primary key" для имеющихся данны
7 сообщений из 7, страница 1 из 1
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107806
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle Linux 8.1.7.4 EE
Код: 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.
drop table test_noval;

 -- создадим таблицу
 
create table test_noval
(
 test_key NUMBER( 16 )
);

 -- добавим первичный ключ
 
alter table test_noval add 
(constraint pk_test_noval primary key (test_key));

 -- вставим данные
 
insert into test_noval values( 1 );
insert into test_noval values( 2 );
insert into test_noval values( 3 );
commit;

 -- посмотрим данные
 
select
  * 
 from
  test_noval;

 -- хочу отключить PK
 
alter table test_noval disable primary key;

 -- вставляем запись с уже имеющимся значением
 
insert into test_noval values( 1 );
commit;

 -- вот здесь декларируется что использование 
 
 -- enable novalidate не затрагивает уже имеющиеся данные
 
alter table test_noval enable novalidate primary key;


Результат выполнения:
Код: 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.
SQLWKS> drop table test_noval;
Предложение обработано.
SQLWKS> 
SQLWKS>  -- создадим таблицу
 
SQLWKS> create table test_noval
      2 > (
      3 >  test_key NUMBER( 16 )
      4 > );
Предложение обработано.
SQLWKS> 
SQLWKS>  -- добавим первичный ключ
 
SQLWKS> alter table test_noval add 
      2 > (constraint pk_test_noval primary key (test_key));
Предложение обработано.
SQLWKS> 
SQLWKS>  -- вставим данные
 
SQLWKS> insert into test_noval values( 1 );
Обработана  1  строка.
SQLWKS> insert into test_noval values( 2 );
Обработана  1  строка.
SQLWKS> insert into test_noval values( 3 );
Обработана  1  строка.
SQLWKS> commit;
Предложение обработано.
SQLWKS> 
SQLWKS>  -- посмотрим данные
 
SQLWKS> select
      2 >   * 
      3 >  from
      4 >   test_noval;
TEST_KEY  
 ----------
 
          1 
          2 
          3 
Выбрано  3  строк.
SQLWKS> 
SQLWKS>  -- хочу отключить PK
 
SQLWKS> alter table test_noval disable primary key;
Предложение обработано.
SQLWKS> 
SQLWKS>  -- вставляем запись с уже имеющимся значением
 
SQLWKS> insert into test_noval values( 1 );
Обработана  1  строка.
SQLWKS> commit;
Предложение обработано.
SQLWKS> 
SQLWKS>  -- вот здесь декларируется что использование 
 
SQLWKS>  -- enable novalidate не затрагивает уже имеющиеся данные
 
SQLWKS> alter table test_noval enable novalidate primary key;
alter table test_noval enable novalidate primary key
*
ORA- 02437 : невозможно подтвердить (WORK.PK_TEST_NOVAL) - нарушен первичный ключ


Вот тут-то и выясняется, что это гадость не работает.
Возникает вопрос - почему???
Кто сталкивался с этим?
...
Рейтинг: 0 / 0
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107821
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в unique deferrable constraint'ах, т.е. с отложенной проверкой целостности требуется создание их по не-уникальному индексу, об этом в доке специально упомянуто. А попробуй и здесь:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table test_noval (
 test_key NUMBER( 16 )
)
/
alter table test_noval add constraint pk_test_noval
  primary key (test_key) 
  using index (
    create index pk_test_noval on test_noval(test_key)
 )
/
...
Рейтинг: 0 / 0
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107836
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синтаксис не проходит. Видимо это из 9i?:
Код: plaintext
1.
2.
3.
4.
5.
SQLWKS> alter table test_noval add constraint pk_test_noval 
      2 > primary key (test_key) using index ( create index pk_test_noval on test_noval(test_key) ); 
primary key (test_key) using index ( create index pk_test_noval on test_noval(test_key) )
                                     *
ORA- 01735 : неверная опция в ALTER TABLE


И вообще странно всё это. В книге по 8i пример даётся - в примере якобы работает.
...
Рейтинг: 0 / 0
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107851
Um
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделай в такой последовательности:

drop table test_noval;

-- создадим таблицу
create table test_noval
(
test_key NUMBER(16)
);

create index pk_test_noval on test_noval(test_key);

insert into test_noval values(1);
insert into test_noval values(2);
insert into test_noval values(3);
commit;

alter table test_noval add
(constraint pk_test_noval primary key (test_key));

alter table test_noval disable primary key;

-- вставляем запись с уже имеющимся значением
insert into test_noval values(1);
commit;

-- вот здесь декларируется что использование
-- enable novalidate не затрагивает уже имеющиеся данные
alter table test_noval enable novalidate primary key;


Просто когда ты создаешь констрайнт примари кей он создает свой уникальный индекс только если не находит уже существующего (хотя бы и неуникального индекса). В такой последовательности он "подцепит" неуникальный pk_test_noval. По крайней мере у меня все заработало...
...
Рейтинг: 0 / 0
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107855
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
Код: plaintext
1.
2.
3.
4.
5.
6.
create index pk_test_noval on test_noval(test_key)
/
alter table test_noval add constraint pk_test_noval
  primary key (test_key)
  using index pk_test_noval
/

А что дает этот novalidate- теперь будет уникалость кроме тех, что же были? Кстати, с вышеизложенным у меня прокатило, на 9-ке правда. А я думал, что не совсем беременным, т.е. не совсем уникальным быть нельзя:)
...
Рейтинг: 0 / 0
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107928
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если создать не уникальный индекс - это работает.
Спасибо за помощь.
Однако как вопринимать то что написано в книге, которая называется
"Oracle8i CERTIFIED PROFESSIONALтм. Подготовка администраторов БД.
Авторы: Джейсон С.Каучмэн Oracle DBA с сертификатом OCP, Ульрике Швин создатель учебного курса Oracle". Книга которая с надписью Oracle Press.

Как же после этого быть с верой в человечество?(как говорил Остап Бендер).

Хотя у меня возникла мысль - авторы пишут что в экзаменах используются вопросы по 8.1.5, так может это так и было в 8.1.5?
...
Рейтинг: 0 / 0
Почему не работает "enable novalidate primary key" для имеющихся данны
    #32107967
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вряд ли. ИМХО уникальный индекс не допускает не-уникальных значений по своему определению. Видать, они тоже человеки:) Вот есть такое замечание:

http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76956/general.htm#12219

Deferrable UNIQUE and PRIMARY keys all must use non-unique indexes.

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


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