| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Oracle > null values unique key |
| Автор: Samotnik 6.5.2011, 11:58 | ||
| Привет Подскажите плиз решение сложившейся ситуации. Есть таблица в БД, в которой есть композитный ключ, который состоит из поля 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 нет. Нашёл похожую проблему в тырнете, предлагают ее решить вот так:
Только я не понимаю, как это применить к моей ситуации, подскажите пожалуйста |
| Автор: Zloxa 6.5.2011, 12:47 | ||
в SQL оракла же нет такого слова. если тебе надо обеспечить уникальность не удаленных записей...
Оракл не хранит в индексе неопределенных значений. Функция, по которой построен индекс, возвращает не определенное значение, если срока помечена как удаленная. В 11й датабазе появились вычислимые столбцы. Мне кажется использовать вычислимый столбец тут было бы более кошерно. |
| Автор: Samotnik 6.5.2011, 12:54 | ||
Попробовал твой код
ошибка: ora-00969 Добавлено через 1 минуту и 58 секунд мне нужно обеспечить чтобы у меня в таблице было только одно ('dima', 0) и сколько угодно ('dima', null) |
| Автор: Zloxa 6.5.2011, 12:56 | ||||
ORA-00969: missing ON keyword вставить после имени индекса:
Добавлено через 42 секунды
|
| Автор: Samotnik 6.5.2011, 12:58 | ||||
http://stackoverflow.com/questions/1374737/how-can-i-create-a-unique-index-in-oracle-but-ignore-nulls похожая проблема, но почему то у меня не работает это решение, я пишу
индекс создается, но всё равно, при попытке вставить второй ('dima', null) - получаю ORA-00001: unique constraint violated Добавлено через 4 минуты и 23 секунды Zloxa, спасибо, выполнил твой
всё равно, при попытке вставить второго ('dima', null) - ORA-00001: unique constraint violated |
| Автор: Samotnik 6.5.2011, 13:16 | ||||||
c false проблемы нету, есть проблема с null. А null остается null'ом без преобразований Добавлено через 1 минуту и 53 секунды
так ведь мне это и нужно, мне нужно разрешить повторение name, если deleted == null Добавлено через 2 минуты и 24 секунды логично ли предположить, что в таком случае
спасет меня ? |
| Автор: Zloxa 6.5.2011, 13:25 | ||
тебе так надо? |
| Автор: Samotnik 6.5.2011, 13:29 |
почти, нужно вот так: 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) |
| Автор: Zloxa 6.5.2011, 13:43 | ||||
я ж говорил - ключ - в этом ))
Добавлено через 9 минут и 28 секунд
жаль не заметил раньше |
| Автор: Samotnik 6.5.2011, 14:27 |
| Zloxa, спасибо, да, действительно всё работает, но. Если у меня уже есть индекс, под названием SYS_C009835, который мешает работе нового, можно как-нибудь приглушить его ? |
| Автор: Zloxa 6.5.2011, 15:01 |
| если он тебе не нужен - дропни его. )) |
| Автор: Samotnik 6.5.2011, 15:06 |
| Zloxa, в общем я понял, спасибо ! |