Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Суть проблемы: Имеется таблица, при проектировании которой не удосужились позабоится о том , чтобы отслеживалась уникальность записи по 5 ее столбцам. Написано клиентское ПО, в котором нет проверки на уникальность вставляемой(или обновляемой) записи. Переписать ПО невозсожно. Задача: Средствами СУБД обеспечить уникальность каждой записи в таблице. Что не получается: Построил уникальный индекс по 5 полям искомой таблицы. Целостность отслеживается конечно. но мне нужно подавить ошибку о дублировании. Поскольку если эта ошибка возникает - то не проходит тразакция, инициированная клиентским ПО. Создаю триггер на insert, update в котором пишу EXCEPTION WHEN unique_violation THEN NULL; Не отслеживается ошибка. Подскажите гуру, как победить проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 08:50 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
а что вы хотите, что бы ошибка была или не была? ) и при ошибке какие хотите сделать действия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 10:13 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
моя задача подавить сообщение об ошоибке о дублировании уникального ключа т.е чтобы СУБД не ругалась в данном конкретном случае. Если такая ситуация возникает - просто скромно промолчать и все. Соответсвенно ничего не делая(апдейт и инсерт в этом слуае проигнорировать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 10:26 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Триггер на BEFORE INSERT OR DELETE в котором проверка, return SKIP если найден дубль. + обычный не уникальный индекс по этим полям для ускорения проверки. Можно не на все поля, а только самые селективные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:11 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Не уверен, что не возникнет ситуации про одновременной вставке двумя разными сессиями, когда для каждой существовать еще не будет, а при коммите получим ошибку, но вот мой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:11 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. вот как оно есть сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:19 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Написал вариант pamir'a повторять не буду. Но то что это полумера опять же соглашусь с pamir'ом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:23 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Господа. Уникальность записи нужно определить по 5 полям. Не меньше. Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено. И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:35 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalex Код: plaintext 1. 2. вот как оно есть сейчас. триггер до вставки... еще не может быть unique_violation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:36 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
в том и дело. а после вставки уже не работает событие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:43 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalexГоспода. Уникальность записи нужно определить по 5 полям. Не меньше. Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено. И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов. Спасибо про 60 млн, не в курсе. селектами проверять НЕПРАВИЛЬНО! задание уже было "удалить зуб не открывая рот" ) Я далеко не гуру в подгрес, по моему мнению, еще как вариант: Включам отложенную проверку целостности, кажись возможно. В триггере AFTER проверяем опять же селектами, в надежде, что по уникальному индексу будет приемлемый поиск, в чем очень сомневаюсь (5 полей 60 млн записей). если уникальность нарушена - удаляем. Хотелось бы услышать мнение Гуру. Вышесказанное бред? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:49 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Думается мне что проверка в триггере перед вставкой записи на уникальность довольно медленный способ.... Особенно если таблица содержит Х млн. записей.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:51 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
наверное, можно еще использовать CONSTRAINT TRIGGER но опять же с селектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:52 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Gold_ rodinalexГоспода. Уникальность записи нужно определить по 5 полям. Не меньше. Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено. И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов. Спасибо про 60 млн, не в курсе. селектами проверять НЕПРАВИЛЬНО! задание уже было "удалить зуб не открывая рот" ) Я далеко не гуру в подгрес, по моему мнению, еще как вариант: Включам отложенную проверку целостности, кажись возможно. В триггере AFTER проверяем опять же селектами, в надежде, что по уникальному индексу будет приемлемый поиск, в чем очень сомневаюсь (5 полей 60 млн записей). если уникальность нарушена - удаляем. Хотелось бы услышать мнение Гуру. Вышесказанное бред? ) Не подойдет. Быстрое решение нужно в том числе из-за кол-ва инсертов в еденицу времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:52 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
XGrayДумается мне что проверка в триггере перед вставкой записи на уникальность довольно медленный способ.... Особенно если таблица содержит Х млн. записей.... Подскажите, как в принципе можно "отменить" вставку в триггере BEFORE не вызывая исключение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 11:53 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
GoldПодскажите, как в принципе можно "отменить" вставку в триггере BEFORE не вызывая исключение? смотри выше - код уже приводили в общем случае - вернуть из триггера null... RETURN NULL; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 12:30 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
domanix.. RETURN NULL; Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 12:48 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html 37.7.5. Trapping Errors /// Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код... не понятно. но уверен что проблема как то решаема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 13:35 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalexhttp://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html 37.7.5. Trapping Errors /// Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код... не понятно. но уверен что проблема как то решаема Стал вызывать отдельную функцию? Или похожее делаешь в триггерной функции. Покажи код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 13:54 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalexhttp://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html 37.7.5. Trapping Errors /// Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код... не понятно. но уверен что проблема как то решаема Стал вызывать отдельную функцию? Или похожее делаешь в триггерной функции. Покажи код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 13:58 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalex Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. вот как оно есть сейчас. писал уже код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 14:04 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalex... писал уже код Так и я писал. Откуда unique_violation, если строчка еще не вставлена. Триггер то BEFORE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 14:11 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Я сюда потому и обратился что не могу самостоятельно найти правильный ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2007, 19:52 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Обработать исключение в триггере невозможно потому как исключение возникает именно во время операции втавки а не перед/после (BEFORE INSERT/AFTER INSERT). Проверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей.... Думаю осталось только одно: уважаемому rodinalex'у поправить иходники постгресса в том месте где возникает искючение unique_violation написать что-то вроде: Код: plaintext 1. 2. 3. 4. 5. А настоящие Гуру пусть посоветуют ему где править :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 08:53 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
XGrayПроверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей....не тормоза при наличии индекса XGrayпоправить иходники постгресса IF(TableName=='test_table')ага :) и предложить этот патч в pgsql-patches ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 10:21 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat XGrayПроверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей....не тормоза при наличии индекса а если по "некому алгоритму" объединить эти пять столбцов в один новый, и сделать по по этому столбцу индекс. Это ускорит поиск? (типа размер индекса станет меньше) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 10:39 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Gold_а если по "некому алгоритму" объединить эти пять столбцов в один новый, и сделать по по этому столбцу индекс. Это ускорит поиск? (типа размер индекса станет меньше)может ускорить, но насколько сильно? уникальный индекс по комбинации пяти полей наверное надо строить, располагая поля в этой комбинации в порядке убывания селективности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 11:43 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
не ребят. вы говорите совсем не то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 14:17 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
rodinalexне ребят. вы говорите совсем не тода и ваша постановка задачи "Нужно подавить ошибку о дублировании. Поскольку если эта ошибка возникает - то не проходит тразакция, инициированная клиентским ПО." смахивает на "не то", имхо противоречит транзакционной модели. а при добавлении условия "решение нужно найти именно без селлектов" становится вообще похожа на "полное не то". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 17:38 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Если такой вариант: Пусть имеется таблица Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext тогда можно попробовать сделать след. образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2007, 17:56 |
|
||
|
unique_violation
|
|||
|---|---|---|---|
|
#18+
Может "правильней" сделать связанную таблицу. В правиле проверяем наличие связанной записи, если нет запускаем соответствующую процедуру, в процедуре добавляем запись, запускаем INSERT/UPDATE В триггере AFTER, удаляем связанную запись. Может так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 09:53 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=2004891]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 429ms |

| 0 / 0 |
