Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> null values unique key, Function-based Index 
V
    Опции темы
Samotnik
Дата 6.5.2011, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Привет smile
Подскажите плиз решение сложившейся ситуации.
Есть таблица в БД, в которой есть композитный ключ, который состоит из поля name и boolean поля deleted.
Возникла проблема, при попытке сделать следующее:
INSERT INTO User (name, deleted) VALUES ('dima', false); -- OK
INSERT INTO User (name, deleted) VALUES ('dima', null); -- OK
INSERT INTO User (name, deleted) VALUES ('dima', null); -- Exception !!!   java.sql.SQLException: ORA-00001: unique constraint violated
В MySQL, такое работает, т.е. можно сколько угодно создать записей ('dima', null), в Oracle нет. 
Нашёл похожую проблему в тырнете, предлагают ее решить вот так:
Код

CREATE UNIQUE INDEX table_1_un ON table_1
(CASE WHEN (col_1 IS NOT NULL AND col_2 IS NOT NULL) THEN col_1 ELSE NULL END,
CASE WHEN (col_2 IS NOT NULL AND col_2 IS NOT NULL) THEN col_2 ELSE NULL END);

Только я не понимаю, как это применить к моей ситуации, подскажите пожалуйста 
 smile 
PM MAIL   Вверх
Zloxa
Дата 6.5.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Samotnik @  6.5.2011,  11:58 Найти цитируемый пост)
false

в SQL оракла же нет такого слова. smile 

Цитата(Samotnik @  6.5.2011,  11:58 Найти цитируемый пост)
решение сложившейся ситуации.

если тебе надо обеспечить уникальность не удаленных записей...
Код

create unique index mytable$name$unc unique(decode(deleted,'N',name));


Оракл не хранит в индексе неопределенных значений. Функция, по которой построен индекс, возвращает не определенное значение, если срока помечена как удаленная.
В 11й датабазе появились вычислимые столбцы. Мне кажется использовать вычислимый столбец тут было бы более кошерно. 

Это сообщение отредактировал(а) Zloxa - 6.5.2011, 12:53


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Samotnik
Дата 6.5.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Цитата(Zloxa @  6.5.2011,  12:47 Найти цитируемый пост)
в оракле же нет такого слова. 

 smile  тут длинная история, я пишу на Java, коннект к БД через hibernate, у хибера подключен ораклавский диалект. В итоге я пишу код на Java false, а что там именно сетится в оракл, я не знаю  smile 
Попробовал твой код
Код

create unique index myuser_unc unique(decode(deleted,'N',name));

ошибка: ora-00969

Добавлено через 1 минуту и 58 секунд
Цитата(Zloxa @  6.5.2011,  12:47 Найти цитируемый пост)
если тебе надо обеспечить уникальность не удаленных записей...

мне нужно обеспечить чтобы у меня в таблице было только одно ('dima', 0) и сколько угодно ('dima', null) 
 smile 
PM MAIL   Вверх
Zloxa
Дата 6.5.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Samotnik @  6.5.2011,  12:54 Найти цитируемый пост)
ora-00969 

ORA-00969: missing ON keyword
вставить после имени индекса:
Код

 on <имя таблицы>


Добавлено через 42 секунды
Код

create unique index myuser_unc on mytable (decode(deleted,'N',name));




--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Samotnik
Дата 6.5.2011, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



вот похожая проблема, но почему то у меня не работает это решение, я пишу
Код

create unique index myuser_uidx on myuser
(nvl2(deleted, name, null), nvl2(name, deleted, null))

индекс создается, но всё равно, при попытке вставить второй ('dima', null) - получаю ORA-00001: unique constraint  violated

Добавлено через 4 минуты и 23 секунды
Zloxa, спасибо, выполнил твой
Код

create unique index myuser_unc on myuser (decode(deleted,'N',name));

всё равно, при попытке вставить второго ('dima', null) - ORA-00001: unique constraint violated
PM MAIL   Вверх
Zloxa
Дата 6.5.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Samotnik @  6.5.2011,  12:58 Найти цитируемый пост)
 я пишу
Код

create unique index myuser_uidx on myuser
(nvl2(deleted, name, null), nvl2(name, deleted, null)

здесь решается совсем другая задача. Данный индекс допустит повторение name если не заполнен deleted и повторение deleted лишь если не заполнен name.

Цитата(Samotnik @  6.5.2011,  12:58 Найти цитируемый пост)
но всё равно, при попытке вставить второй ('dima', null) - получаю ORA-00001: unique constraint  violated 

Надо разбраться во что хибер преобразует false. В этом ключ к успеху действа

Добавлено @ 13:15
Цитата(Samotnik @  6.5.2011,  12:58 Найти цитируемый пост)
 ('dima', null)

если false преобразуется в null, то индексирваться должно выражение (decode(deleted,null,name))

Это сообщение отредактировал(а) Zloxa - 6.5.2011, 13:16


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Samotnik
Дата 6.5.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Цитата(Zloxa @  6.5.2011,  13:10 Найти цитируемый пост)
Надо разбраться во что хибер преобразует false. В этом ключ к успеху действа

c false проблемы нету, есть проблема с null. А null остается null'ом без преобразований

Добавлено через 1 минуту и 53 секунды
Цитата(Zloxa @  6.5.2011,  13:10 Найти цитируемый пост)
здесь решается совсем другая задача. Данный индекс допустит повторение name если не заполнен deleted

так ведь мне это и нужно, мне нужно разрешить повторение name, если deleted == null

Добавлено через 2 минуты и 24 секунды
логично ли предположить, что в таком случае
Код

create unique index myuser_uidx on myuser
(nvl2(deleted, name, null)

спасет меня ?
PM MAIL   Вверх
Zloxa
Дата 6.5.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Код

SQL> create table test (name varchar2(10),deleted number);
 
Table created
SQL> create unique index test$idx on test (nvl2(deleted,name,null),nvl2(name,deleted,null));
 
Index created
SQL> insert into test values ('дима',1);
 
1 row inserted
SQL> insert into test values ('дима',null);
 
1 row inserted
SQL> insert into test values ('дима',null);
 
1 row inserted
SQL> insert into test values (null,1);
 
1 row inserted
SQL> insert into test values (null,1);
 
1 row inserted
SQL> insert into test values ('дима',1);
 
insert into test values ('дима',1)
 
ORA-00001: unique constraint (ODYSSEY_GATE.TEST$IDX) violated

тебе так надо?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Samotnik
Дата 6.5.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Цитата(Zloxa @  6.5.2011,  13:25 Найти цитируемый пост)
тебе так надо? 

почти, нужно вот так:
insert into test values ('дима',0); - ok
insert into test values ('дима',null); - ok
insert into test values ('дима',null); - ok
insert into test values ('дима',null); - ok
insert into test values ('дима',null); - ok
insert into test values ('дима',null); - ok
insert into test values ('дима',null); - ok
insert into test values ('дима',0); -  тут должна быть ошибка, потому что уже есть "дима" не удаленный, у которого deleted - 0 (т.е. false)
PM MAIL   Вверх
Zloxa
Дата 6.5.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(Samotnik @  6.5.2011,  13:29 Найти цитируемый пост)
deleted - 0 (т.е. false) 

я ж говорил - ключ - в этом ))
Код

SQL> create table test (name varchar2(10),deleted number);
 
Table created
SQL> create unique index test$idx on test (decode(deleted,0,name));
 
Index created
SQL> insert into test values ('дима',0);
 
1 row inserted
SQL> insert into test values ('дима',null);
 
1 row inserted
SQL> insert into test values ('дима',null);
 
1 row inserted
SQL> insert into test values ('дима',1);
 
1 row inserted
SQL> insert into test values ('дима',1);
 
1 row inserted
SQL> insert into test values ('дима',0);
 
insert into test values ('дима',0)
 
ORA-00001: unique constraint (ODYSSEY_GATE.TEST$IDX) violated
 


Добавлено через 9 минут и 28 секунд
Цитата(Samotnik @  6.5.2011,  12:54 Найти цитируемый пост)
мне нужно обеспечить чтобы у меня в таблице было только одно ('dima', 0) и сколько угодно ('dima', null) 

жаль не заметил раньше smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Samotnik
Дата 6.5.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Zloxa, спасибо, да, действительно всё работает, но. 
Если у меня уже есть индекс, под названием SYS_C009835, который мешает работе нового, можно как-нибудь приглушить его ? smile
PM MAIL   Вверх
Zloxa
Дата 6.5.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



если он тебе не нужен - дропни его. ))


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Samotnik
Дата 6.5.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Zloxa, в общем я понял, спасибо !  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1158 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.