Една опция да продължите да използвате актуализация и все още да връщате конфликтните редове е да създадете функция, която извършва тази проверка, преди да извършите актуализацията. В случай, че първичният ключ вече съществува, той връща конфликтния ред, а ако не, редът се актуализира. Пример за такава функция може да бъде:
CREATE OR REPLACE FUNCTION my_func(cont TEXT, lang INT, idp TEXT)
RETURNS SETOF sentence AS $$
DECLARE j RECORD;
BEGIN
SELECT * FROM sentence WHERE content = cont AND
language_id = lang INTO j;
IF j IS NOT NULL THEN
RETURN NEXT j;
ELSE
RETURN QUERY UPDATE sentence SET content = cont, language_id= lang
WHERE id = idp RETURNING *;
END IF;
EXCEPTION WHEN SQLSTATE '23505' THEN
RETURN QUERY SELECT * FROM sentence WHERE content = cont AND
language_id= lang;
END$$ LANGUAGE plpgsql;
SELECT my_func('This is a sentence',834,'0538f24a-2046-4da6-933d-409aa7b7c597');
РЕДАКТИРАНЕ :Ако няма конфликт и все още искате RETURNING *
, просто добавете RETURN QUERY
към UPDATE
изявление:
...
RETURN QUERY
UPDATE sentence SET content = cont, language_id= lang WHERE id = idp
RETURNING *;
...