выполнить удаление или обновление уникального нарушения в postgres - PullRequest
0 голосов
/ 10 января 2011

На исключении Unique_violation, как обновить или удалить строку, вызвавшую исключение

код таблицы и вставка

create table test
(
id serial not null,
str character varying NOT NULL,
is_dup boolean DEFAULT false,
CONSTRAINT test_str_unq UNIQUE (str)
);

INSERT INTO test(str) VALUES ('apple'),('giant'),('company'),('ap*p*le');

Функция

CREATE OR REPLACE FUNCTION rem_chars()
  RETURNS void AS
$BODY$

BEGIN
begin 
update test set str=replace(str,'*','');
EXCEPTION WHEN unique_violation THEN
--what to do here to delete the row which raised exception or
--to update the is_dup=true to that row 
end;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION rem_chars() OWNER TO postgres;

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

- это покажет вам все потенциальные столкновения клавиш

SELECT a.id, a.str, b.id , b.str
FROM test a, test b
WHERE a.str = replace(b.str,'*','')
AND a.id < b.id;

- это удалит их

DELETE FROM test WHERE id IN (
  SELECT b.id
  FROM test a, test b
  WHERE a.str = replace(b.str,'*','')
  AND a.id < b.id
);
0 голосов
/ 11 января 2011

Я думаю, что единственным решением является сделать это в два этапа:

UPDATE test 
  SET str = replace(str,'*','')
  WHERE str NOT IN (SELECT replace(str,'*','') FROM test);

UPDATE test
  SET is_dup = true
  WHERE str IN (SELECT replace(str,'*','') FROM test);

По крайней мере, я не могу придумать более эффективный способ.

...