Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему не работает "enable novalidate primary key" для имеющихся данны / 7 сообщений из 7, страница 1 из 1
18.02.2003, 12:03
    #32107806
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает "enable novalidate primary key" для имеющихся данны
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
18.02.2003, 12:22
    #32107821
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает "enable novalidate primary key" для имеющихся данны
Вот в 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
18.02.2003, 12:35
    #32107836
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает "enable novalidate primary key" для имеющихся данны
Синтаксис не проходит. Видимо это из 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
18.02.2003, 12:49
    #32107851
Um
Um
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает "enable novalidate primary key" для имеющихся данны
сделай в такой последовательности:

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
18.02.2003, 12:52
    #32107855
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает "enable novalidate primary key" для имеющихся данны
А так?
Код: 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
18.02.2003, 13:52
    #32107928
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему не работает "enable novalidate primary key" для имеющихся данны
Да, если создать не уникальный индекс - это работает.
Спасибо за помощь.
Однако как вопринимать то что написано в книге, которая называется
"Oracle8i CERTIFIED PROFESSIONALтм. Подготовка администраторов БД.
Авторы: Джейсон С.Каучмэн Oracle DBA с сертификатом OCP, Ульрике Швин создатель учебного курса Oracle". Книга которая с надписью Oracle Press.

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

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

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


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