Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Unique index with different NULL values  [new]
stavelot
Member

Откуда:
Сообщений: 358
Есть таблица по которой нужно создать уникальный индекс по двум полям с учетом того, что бы NULL значения при повторной вставке в таблицу были каждый раз уникальными.

Как вариант думаю сделать вот так:

create unique index idx_tb1
        on tb1(nvl2(c1, c2, null), nvl2(c1, c2, null) );


На сколько этот вариант будет корректен в данной ситуации?
11 мар 13, 19:11    [14037097]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
juras
Member

Откуда: Прага
Сообщений: 257
stavelot,

А пара (null, null) и (null, null) уникальная?
11 мар 13, 19:26    [14037137]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
stavelot
с учетом того, что бы NULL значения при повторной вставке в таблицу были каждый раз уникальными.

Приведи пример, камрад
11 мар 13, 19:27    [14037140]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
-2-
Member

Откуда:
Сообщений: 15330
stavelot,

В зависимости от очень нескольких вопросов:
(nvl(c1, -id), nvl(c2, -id))
11 мар 13, 19:30    [14037146]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
stavelot
Member

Откуда:
Сообщений: 358
Изя Кацман
stavelot
с учетом того, что бы NULL значения при повторной вставке в таблицу были каждый раз уникальными.

Приведи пример, камрад


Что бы при вставке эти значения с NULL были уникальны:

insert into tb1 values(NULL,NULL);
insert into tb1 values(NULL,NULL);
insert into tb1 values(1,NULL);
insert into tb1 values(1,NULL);
insert into tb1 values(NULL,2);
insert into tb1 values(NULL,2);
11 мар 13, 19:35    [14037164]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
Sacramento
Member [заблокирован]

Откуда: from Paris with love
Сообщений: 525
сreate unique index idx_tb1 on tb1 (nvl(с1, sys_guid()), nvl(с2, sys_guid()));

этта?
11 мар 13, 19:53    [14037207]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
-2-
Member

Откуда:
Сообщений: 15330
stavelot
Что бы при вставке эти значения с NULL были уникальны
твой вариант подойдет, если подравить один nvl2.
11 мар 13, 19:57    [14037218]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
stavelot
Member

Откуда:
Сообщений: 358
Sacramento
сreate unique index idx_tb1 on tb1 (nvl(с1, sys_guid()), nvl(с2, sys_guid()));

этта?


sys_guid() - не прокатит с типом number
11 мар 13, 20:08    [14037238]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
stavelot
Member

Откуда:
Сообщений: 358
-2-
stavelot
Что бы при вставке эти значения с NULL были уникальны
твой вариант подойдет, если подравить один nvl2.


Как предлагаете подправить?
11 мар 13, 20:11    [14037251]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
stavelot
Member

Откуда:
Сообщений: 358
stavelot
-2-
пропущено...
твой вариант подойдет, если подравить один nvl2.


Как предлагаете подправить?

create unique index idx_tb1
        on tb1(nvl2(c1, c2, null), nvl2(c2, c1, null) );
- вот так было изначально.
11 мар 13, 20:16    [14037259]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
stavelot
sys_guid() - не прокатит с типом number


SQL> select  rownum,
  2          c1,
  3          c2
  4    from  tb1
  5  /

    ROWNUM         C1         C2
---------- ---------- ----------
         1          1
         2          1
         3                     2
         4                     2
         5
         6

6 rows selected.

SQL> create unique index tb1_uidx1
  2    on tb1(
  3           c1,
  4           c2,
  5           nvl2(c1,'0',sys_guid()),
  6           nvl2(c2,'0',sys_guid())
  7          )
  8  /

Index created.

SQL> exec dbms_stats.gather_table_stats('SCOTT','TB1')

PL/SQL procedure successfully completed.

SQL> explain plan for
  2  select  *
  3    from  tb1
  4    where c1 is null
  5  /

Explained.

SQL> @?\rdbms\admin\utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2703475935

------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |           |     4 |    16 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| TB1_UIDX1 |     4 |    16 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   1 - access("C1" IS NULL)

13 rows selected.

SQL> explain plan for
  2  select  *
  3    from  tb1
  4    where c1 is null
  5       or c1 = 1
  6  /

Explained.

SQL> @?\rdbms\admin\utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 586718341

------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |           |     5 |    20 |     1   (0)| 00:00:01 |
|*  1 |  INDEX FULL SCAN | TB1_UIDX1 |     5 |    20 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   1 - filter("C1" IS NULL OR "C1"=1)

13 rows selected.

SQL> explain plan for
  2  select  *
  3    from  tb1
  4    where c1 is null
  5      and c2 is null
  6  /

Explained.

SQL> @?\rdbms\admin\utlxpls

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2703475935

------------------------------------------------------------------------------
| Id  | Operation        | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |           |     3 |    12 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| TB1_UIDX1 |     3 |    12 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

   1 - access("C1" IS NULL AND "C2" IS NULL)
       filter("C2" IS NULL)

14 rows selected.

SQL>  


SY.

Сообщение было отредактировано: 11 мар 13, 20:21
11 мар 13, 20:19    [14037265]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
я бы вместо индекса подумал про матвью он коммит с группировкой
11 мар 13, 20:54    [14037379]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Поостороднее с индексами
SQL> create index i on t ( sys_guid() );
 
Index created
SQL> delete t where rownum = 1;
 
delete t where rownum = 1
 
ORA-08102: index key not found, obj# 63346, file 1, block 92496 (2)
12 мар 13, 10:20    [14038627]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
Sacramento
Member [заблокирован]

Откуда: from Paris with love
Сообщений: 525
stavelot
Есть таблица по которой нужно создать уникальный индекс по двум полям с учетом того, что бы NULL значения при повторной вставке в таблицу были каждый раз уникальными.
На сколько этот вариант будет корректен в данной ситуации?


А автор вообще удосужиццо рассказать зачем ему в индекс понадобилос засовывать значения которых нет в таблице?
Поспорил на бутылку с админом шо сломаеш огакел, хе-х?
12 мар 13, 11:23    [14039029]     Ответить | Цитировать Сообщить модератору
 Re: Unique index with different NULL values  [new]
stax..
Guest
stavelot
stavelot
пропущено...


Как предлагаете подправить?

create unique index idx_tb1
        on tb1(nvl2(c1, c2, null), nvl2(c2, c1, null) );
- вот так было изначально.

а если так?
create unique index u_null$tbl on tbl(nvl2(c1+c2,c1,null),nvl2(c1+c2,c2,null))
/
SQL> select * from tbl;

        C1         C2
---------- ----------


         1
         1
                    2
                    2

6 rows selected.

SQL>

.....
stax
12 мар 13, 15:43    [14040945]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить