Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня.. Есть необходимость проверить уникальность по некотрым полям, при некоторых условиях. Возможностей индекса (функционального. частичного) не хватает. Решил использовать триггеры. Написать триггеры 100% гарантирующих уникальность не сумел. Что хотел сделать продемонстрирую на простом примере: уникальность по одному полю. Код: 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. Код: plaintext Как правильно написать такой триггер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2008, 16:42 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
Мнэ... Можно пример, почему встроенных возможностей не хватило? Для БД попроще используется такая техника: строится вспомогательная таблица с нужными полями и обычным уникальным индексом. Эта табличка заполняется /триггером или из приложения/ при изменении основной таблицы, при выполнении заданных условий. Как бы эмуляция частичного индекса получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 03:55 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
В настоящее время скорее из-за ошибки проектировки, уникальность зависисит от значений в связянной таблице (решение с доп. таблицей подойдет). Еще пример, проверка на не пересечение интервалов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 09:13 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
Gold_В настоящее время скорее из-за ошибки проектировки, уникальность зависисит от значений в связянной таблице (решение с доп. таблицей подойдет). Еще пример, проверка на не пересечение интерваловмне кажется это решается написанием булевой ф-ции и использованием не триггера, но констрайнта CHECK (который сам где-то там, внутре, создаст констрайнт-триггер, но это нам вроде как знать и не обязательно). Кстати сказать - и на связанную таблицу ведь тоже надо что-то вешать. Или она намертво неапдейтуемая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 10:18 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
4321 Gold_В настоящее время скорее из-за ошибки проектировки, уникальность зависисит от значений в связянной таблице (решение с доп. таблицей подойдет). Еще пример, проверка на не пересечение интерваловмне кажется это решается написанием булевой ф-ции и использованием не триггера, но констрайнта CHECK ... Что должна проверять функция? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 11:35 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
4321мне кажется это решается написанием булевой ф-ции и использованием не триггера, но констрайнта CHECK (который сам где-то там, внутре, создаст констрайнт-триггер, но это нам вроде как знать и не обязательно). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. 3. 4. 5. 6. 7. этого же эффекта можно добиться и без задержки, если просто изоляцию транзакции повысить до serializable, тогда check просто не увидит данные закомиченные в соседней транзакции... можно сделать deferred constraint триггер, но фича с задержкой (промежутком времени между проверкой и реальным коммитом) и у него будет... имхо только через блокировки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 11:44 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
Ёшспасибо. еще раз напомнили давнопроверенное, - что (межтабличная) уникальность через чек - это заблуждение. Кстати, никакого слипа внутри ф-ии чека и не нужно. Оно и так позволяет. (проверил в двух независимых окнах. Вспомнил, что уже обламывался с идеей.) Ёшможно сделать deferred constraint триггересли я правильно понял, то честный deferred создается только для FKey-ев. Остальное - врукопашку, т.е. от лукавого. Но интересно было бы проверить. (однако потом, как я помню, врукопашку надо грохать constraint-триггера, поэтому без подготовки не взялся - без аккуратности тут скорее насодишь десяток constraint-триггеров и не будешь понимать, что вообще происходит. А с аккуратностью у меня нынче проблемы - сильнейший "простудифилис весенний"). т.е. ,насколько я вас неправильно понял, - вставлять рекомендуете только через хранимки, а в них делать что-то типа .... FOR UPDATE? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 12:48 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
4321 Ёшможно сделать deferred constraint триггересли я правильно понял, то честный deferred создается только для FKey-ев. Остальное - врукопашку, т.е. от лукавого. Но интересно было бы проверить.вот это вроде ещё "честный deferred", насколько я понимаю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2008, 18:33 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял вопрос и требуется, чтобы с одинаковым индексом не создавались строки, то надо триггер сделать не "после", а "до" вставки-изменения т.е. вместо Код: plaintext поставить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2008, 10:20 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
QuadrixЕсли я правильно понял вопрос и требуется, чтобы с одинаковым индексом не создавались строки, то надо триггер сделать не "после", а "до" вставки-изменения т.е. вместо Код: plaintext поставить Код: plaintext Вы ошибаетесь. Триггер "до" только ухудшить положение (время между проверкой и потверждением транакции увеличится) В моем триггере в комментариях тоже описка в строчке: Код: plaintext 1. Код: plaintext 1. Но ни такого уровня, ни возможности переключения в постгресе нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2008, 12:48 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
Ёш вот это вроде ещё "честный deferred", насколько я понимаю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Ёшя имел ввиду что можно заблокировать в тригере перед вызовом select count() ... таблицу целиком, что бы исключить конкурирующие insert'ы, а for update имхо не запрещает вроде ж insert...да, я даже на всякий потестил. не выходит. вот если уникью лочит значение, то тут придется лочить всю таблицу. Т.ч. видимо можно поискать в сторону (межтабличного) "мат-вью" с уникью. Затраты могут окупиться (за счет снятия блокировки таблицы целиком). Интересно ,в постгресе есть возможность слепить чисто "индексно"-хранимые таблички? (не может видимо быть. т.к. постгрессовский индекс кажется не держит данных о транзакции. А ведь для межтабличного индекса они были бы к месту.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2008, 11:15 |
|
||
|
как проверить уникальность при невозмлжности использовать индекс
|
|||
|---|---|---|---|
|
#18+
4321 Ёш вот это вроде ещё "честный deferred", насколько я понимаю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. да, я тоже читал краем уха что-то про это, что не советуют это использовать :) и в доках про constraint trigger name до 8.3 было написано: "The name of the constraint trigger. The actual name of the created trigger will be of the form RI_ConstraintTrigger_0000 (where 0000 is some number assigned by the server). Use this assigned name when dropping the trigger." но в 8.3 уже: "The name of the constraint trigger. This is also the name to use when modifying the trigger's behavior using SET CONSTRAINTS. The name cannot be schema-qualified — the trigger inherits the schema of its table." имхо было что-то докручено в плане удобства и разрешения использования этой фишки, но подробностей не читал. 4321 Ёшя имел ввиду что можно заблокировать в тригере перед вызовом select count() ... таблицу целиком, что бы исключить конкурирующие insert'ы, а for update имхо не запрещает вроде ж insert...да, я даже на всякий потестил. не выходит. вот если уникью лочит значение, то тут придется лочить всю таблицу. Т.ч. видимо можно поискать в сторону (межтабличного) "мат-вью" с уникью. Затраты могут окупиться (за счет снятия блокировки таблицы целиком).а можно сделать через unique проверку пересечения хотя бы в одной таблице ? мне почему-то кажется что это возможно, но как сделать в реале - не могу понять %) допустим есть та же таблица ttt (id int, a int, b int) и нужно что бы в ней небыло пересекающихся промежутков [a,b] (для простоты - a нижняя граница и всегда меньше или равно b). A [a1, b1] персекается с B [a2, b2] если a2 входит в [a1,b1] или b2 входит в [a1,b1] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2008, 15:24 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=270&tid=2004381]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 366ms |

| 0 / 0 |
