powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Активность записи.
13 сообщений из 13, страница 1 из 1
Активность записи.
    #32113863
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с данными:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table test (
    test_id number( 9 )
  , active_flag number( 1 )
  , constraint ch_test_active_flag
      check (active_flag is null or active_flag =  1 )
)
/
insert into test(test_id, active_flag) values ( 1 , null);
insert into test(test_id, active_flag) values ( 1 , null);
insert into test(test_id, active_flag) values ( 1 ,  1 );
insert into test(test_id, active_flag) values ( 2 , null);
insert into test(test_id, active_flag) values ( 2 ,  1 );
commit;

Можно ли как-нибудь на уровне БД наложить следующее ограничение: для каждого test_id может быть сколько угодно записей с active_flag is null, но только одна запись с active_flag=1? С возможностью изменять записи в дальнейшем.
...
Рейтинг: 0 / 0
Активность записи.
    #32113877
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не понял сути, но:
Чем не подходит юник по этим двум полям?
Ведь null же...
...
Рейтинг: 0 / 0
Активность записи.
    #32113879
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uniq не подходит по причине "возникания" на дублирование строки типа (1,NULL)...

2 Денис,

а почему не написать тригер?
если пугает проблема мутирования, то здесь есть несколько решений...
...
Рейтинг: 0 / 0
Активность записи.
    #32113883
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да действительно возникает
Но мне казалось что поля типа null на юник не реагируют....
...
Рейтинг: 0 / 0
Активность записи.
    #32113885
_kyky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать проверку в процедурах (insert_sp,update_sp,...)
и только через них и работать.
...
Рейтинг: 0 / 0
Активность записи.
    #32113887
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
они не влияют только если все поля индекса являются NULL'ами или в случае одного поля происходит так как вы сказали...
...
Рейтинг: 0 / 0
Активность записи.
    #32113889
Фотография Oracle X-pert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A ob func index ne dumal?
Nu tam sum(active_flag = 1)?
Postroiv indextype, konechno.
...
Рейтинг: 0 / 0
Активность записи.
    #32113994
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create unique index test_active on oappl.test (decode (active_flag,1,test_id,null))
...
Рейтинг: 0 / 0
Активность записи.
    #32114057
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во, спасибо, оно самое.
...
Рейтинг: 0 / 0
Активность записи.
    #32114108
Фотография MaxU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> create unique index test_active on oappl.test (decode (active_flag,1,test_id,null))

bravo!
krasivoe reshenie!
...
Рейтинг: 0 / 0
Активность записи.
    #32114158
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov: А как насчёт enable novalidate?
...
Рейтинг: 0 / 0
Активность записи.
    #32114165
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь вот сижу и думаю: задачка-то посложнее. Есть snapshot-репликация, и хотелось бы ограничение уникальности по active_flag сделать отложенным (deferrable). Ему требуется неуникальный индекс, но как совместиь все это- не пойму. Т.е. такая конструкция не проходит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create index ix_test_active on test (decode(active_flag,  1 , test_id))
/

alter table test add constraint ak_test_active
  unique (decode(active_flag,  1 , test_id))
  deferrable initially deferred
  using index ix_test_active
/
ORA- 00904 : : invalid identifier


alter table test add constraint ak_test_active
  unique (active_flag)
  deferrable initially deferred
  using index ix_test_active
/

ORA- 01418 : specified index does not exist


В принципе решение есть: писать в active_flag не 1, а test_id. Быть проще, в общем.
...
Рейтинг: 0 / 0
Активность записи.
    #32114496
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2softbuilder@inbox.ru: Это OLTP-таблица, так что на каждый чих включать/выключать ограничения не получится.

И умилился: все-таки решение такой задачи что "ручками", что с использованией Function-Based Indexes по своему принципу одинаково. Ораклы, ничтоже сумнящеся, добавляют поле в таблицу, куда складывают вычисляемые значения. Удобство лишь в том, что ты об этом явно не знаешь, хотя м.б. и зря. Вот смотри, вся кухня выползает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table test (name varchar2( 64 ))
/
create index ix_test_name on test(upper(name))
/
select table_name, column_name, data_type, data_default 
from dba_tab_cols 
where owner = user 
  and table_name like 'TEST'
/
select index_name, table_name, column_name 
from user_ind_columns 
where index_name like 'IX_TEST_NAME'
/
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Активность записи.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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