powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / unique_violation
25 сообщений из 31, страница 1 из 2
unique_violation
    #34889812
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Суть проблемы:
Имеется таблица, при проектировании которой не удосужились позабоится о том , чтобы отслеживалась уникальность записи по 5 ее столбцам.
Написано клиентское ПО, в котором нет проверки на уникальность вставляемой(или обновляемой) записи. Переписать ПО невозсожно.

Задача: Средствами СУБД обеспечить уникальность каждой записи в таблице.

Что не получается:
Построил уникальный индекс по 5 полям искомой таблицы. Целостность отслеживается конечно. но мне нужно подавить ошибку о дублировании. Поскольку если эта ошибка возникает - то не проходит тразакция, инициированная клиентским ПО.
Создаю триггер на insert, update
в котором пишу

EXCEPTION WHEN unique_violation THEN
NULL;

Не отслеживается ошибка.
Подскажите гуру, как победить проблему
...
Рейтинг: 0 / 0
unique_violation
    #34890017
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а что вы хотите, что бы ошибка была или не была? )
и при ошибке какие хотите сделать действия?
...
Рейтинг: 0 / 0
unique_violation
    #34890085
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
моя задача подавить сообщение об ошоибке о дублировании уникального ключа
т.е чтобы СУБД не ругалась в данном конкретном случае. Если такая ситуация возникает - просто скромно промолчать и все. Соответсвенно ничего не делая(апдейт и инсерт в этом слуае проигнорировать)
...
Рейтинг: 0 / 0
unique_violation
    #34890310
сансаныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггер на BEFORE INSERT OR DELETE в котором проверка, return SKIP если найден дубль.
+ обычный не уникальный индекс по этим полям для ускорения проверки. Можно не на все поля, а только самые селективные
...
Рейтинг: 0 / 0
unique_violation
    #34890311
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что не возникнет ситуации про одновременной вставке двумя разными сессиями, когда для каждой существовать еще не будет, а при коммите получим ошибку, но вот мой вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE test_rule
(
  id serial NOT NULL,
  unifield integer,
  CONSTRAINT d PRIMARY KEY (id),
  CONSTRAINT dg UNIQUE (unifield)
) 

Код: plaintext
1.
2.
3.
4.
CREATE OR REPLACE RULE test AS
    ON INSERT TO test_rule
   WHERE (EXISTS ( SELECT  1 
           FROM test_rule
          WHERE test_rule.unifield = new.unifield)) DO INSTEAD NOTHING;
...
Рейтинг: 0 / 0
unique_violation
    #34890334
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
CREATE TRIGGER "main_error_free_tr" BEFORE INSERT 
ON "public"."main" FOR EACH ROW 
EXECUTE PROCEDURE "public"."key_error_free"();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION "public"."key_error_free" () RETURNS trigger AS
$body$
begin
   
   EXCEPTION WHEN 	unique_violation THEN    
   RETURN NULL;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

вот как оно есть сейчас.
...
Рейтинг: 0 / 0
unique_violation
    #34890352
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал вариант
pamir'a
повторять не буду.
Но то что это полумера опять же соглашусь с pamir'ом
...
Рейтинг: 0 / 0
unique_violation
    #34890411
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа. Уникальность записи нужно определить по 5 полям. Не меньше.
Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено.
И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов.
Спасибо
...
Рейтинг: 0 / 0
unique_violation
    #34890420
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rodinalex
Код: plaintext
1.
2.
CREATE TRIGGER "main_error_free_tr" BEFORE INSERT 
ON "public"."main" FOR EACH ROW 
EXECUTE PROCEDURE "public"."key_error_free"();
...
вот как оно есть сейчас.

триггер до вставки... еще не может быть unique_violation
...
Рейтинг: 0 / 0
unique_violation
    #34890457
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в том и дело. а после вставки уже не работает событие
...
Рейтинг: 0 / 0
unique_violation
    #34890492
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rodinalexГоспода. Уникальность записи нужно определить по 5 полям. Не меньше.
Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено.
И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов.
Спасибо

про 60 млн, не в курсе.
селектами проверять НЕПРАВИЛЬНО!
задание уже было "удалить зуб не открывая рот" )
Я далеко не гуру в подгрес, по моему мнению, еще как вариант:
Включам отложенную проверку целостности, кажись возможно.
В триггере AFTER проверяем опять же селектами, в надежде, что по уникальному индексу будет приемлемый поиск, в чем очень сомневаюсь (5 полей 60 млн записей).
если уникальность нарушена - удаляем.
Хотелось бы услышать мнение Гуру.
Вышесказанное бред? )
...
Рейтинг: 0 / 0
unique_violation
    #34890503
XGray
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думается мне что проверка в триггере перед вставкой записи на уникальность
довольно медленный способ....
Особенно если таблица содержит Х млн. записей....
...
Рейтинг: 0 / 0
unique_violation
    #34890509
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверное, можно еще использовать
CONSTRAINT TRIGGER
но опять же с селектами.
...
Рейтинг: 0 / 0
unique_violation
    #34890513
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold_ rodinalexГоспода. Уникальность записи нужно определить по 5 полям. Не меньше.
Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено.
И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов.
Спасибо

про 60 млн, не в курсе.
селектами проверять НЕПРАВИЛЬНО!
задание уже было "удалить зуб не открывая рот" )
Я далеко не гуру в подгрес, по моему мнению, еще как вариант:
Включам отложенную проверку целостности, кажись возможно.
В триггере AFTER проверяем опять же селектами, в надежде, что по уникальному индексу будет приемлемый поиск, в чем очень сомневаюсь (5 полей 60 млн записей).
если уникальность нарушена - удаляем.
Хотелось бы услышать мнение Гуру.
Вышесказанное бред? )

Не подойдет. Быстрое решение нужно в том числе из-за кол-ва инсертов в еденицу времени.
...
Рейтинг: 0 / 0
unique_violation
    #34890519
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
XGrayДумается мне что проверка в триггере перед вставкой записи на уникальность
довольно медленный способ....
Особенно если таблица содержит Х млн. записей....
Подскажите, как в принципе можно "отменить" вставку в триггере BEFORE не вызывая исключение?
...
Рейтинг: 0 / 0
unique_violation
    #34890755
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GoldПодскажите, как в принципе можно "отменить" вставку в триггере BEFORE не вызывая исключение?
смотри выше - код уже приводили
в общем случае - вернуть из триггера null...
RETURN NULL;
...
Рейтинг: 0 / 0
unique_violation
    #34890842
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
domanix..
RETURN NULL;

Спасибо.
...
Рейтинг: 0 / 0
unique_violation
    #34891125
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html
37.7.5. Trapping Errors
///
Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код...
не понятно. но уверен что проблема как то решаема
...
Рейтинг: 0 / 0
unique_violation
    #34891216
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rodinalexhttp://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html
37.7.5. Trapping Errors
///
Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код...
не понятно. но уверен что проблема как то решаема

Стал вызывать отдельную функцию?
Или похожее делаешь в триггерной функции. Покажи код.
...
Рейтинг: 0 / 0
unique_violation
    #34891234
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rodinalexhttp://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html
37.7.5. Trapping Errors
///
Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код...
не понятно. но уверен что проблема как то решаема

Стал вызывать отдельную функцию?
Или похожее делаешь в триггерной функции. Покажи код.
...
Рейтинг: 0 / 0
unique_violation
    #34891267
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rodinalex
Код: plaintext
1.
2.
CREATE TRIGGER "main_error_free_tr" BEFORE INSERT 
ON "public"."main" FOR EACH ROW 
EXECUTE PROCEDURE "public"."key_error_free"();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION "public"."key_error_free" () RETURNS trigger AS
$body$
begin
   
   EXCEPTION WHEN 	unique_violation THEN    
   RETURN NULL;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

вот как оно есть сейчас.

писал уже код
...
Рейтинг: 0 / 0
unique_violation
    #34891297
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rodinalex...

писал уже код

Так и я писал. Откуда unique_violation, если строчка еще не вставлена.
Триггер то BEFORE
...
Рейтинг: 0 / 0
unique_violation
    #34892728
rodinalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сюда потому и обратился что не могу самостоятельно найти правильный ответ.
...
Рейтинг: 0 / 0
unique_violation
    #34893189
XGray
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обработать исключение в триггере невозможно потому как исключение возникает именно во время операции втавки а не перед/после (BEFORE INSERT/AFTER INSERT).

Проверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей....

Думаю осталось только одно: уважаемому rodinalex'у поправить иходники постгресса
в том месте где возникает искючение unique_violation написать что-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
 IF(TableName=='test_table'){
  ничего не делаем;
 }else{
  вызываем исключение;
 }

А настоящие Гуру пусть посоветуют ему где править :)
...
Рейтинг: 0 / 0
unique_violation
    #34893381
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XGrayПроверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей....не тормоза при наличии индекса

XGrayпоправить иходники постгресса
IF(TableName=='test_table')ага :) и предложить этот патч в pgsql-patches
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / unique_violation
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]