Необходимо написать функцию, которая бы выдавала ИД записи, если такова существует или бы создавала новую запись и опять же возвращала бы ИД.
Попробовал такой вариант:
CREATE OR REPLACE FUNCTION getMarkId(character varying)
RETURNS integer AS
$BODY$
DECLARE
BEGIN
IF(SELECT id FROM «Marks» WHERE «name» = $1) THEN
RETURN id FROM «Marks» WHERE «name» = $1;
ELSE
INSERT INTO «Marks» («name») VALUES ($1) RETURNING id;
RETURN getMarkId($1);
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
Проблема №1:
Тут селект используется два раза + рекурсия, что, наверно, повлияет на производительность, да и выглядит довольно криво.
Проблема №2:
Если запись существует, то всё ок, а если нужно создать новую, то выдаёт такую ошибку:
ERROR: duplicate key value violates unique constraint «Marks_pkey»
CONTEXT: SQL statement «INSERT INTO „Marks“ („name“) VALUES ( $1 )»
PL/pgSQL function «getmarkid» line 6 at SQL statement
Поскольку сам с функциями в постгресе ещё не до конца разобрался, прошу коллективной помощи :)
Ответ на:
комментарий
от SaBo
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум INSERT ... ON CONFLICT DO UPDATE ... RETURNING id (2016)
- Форум Ошибка при постинге (2010)
- Форум Ошибка при добавлении поста (2016)
- Форум тупилово (2008)
- Форум PostgreSQL: UPDATE из DELETE-триггера в обход UPDATE-триггера (2016)
- Форум Проблема с упорядочиванием записей в PostgreSQL (2017)
- Форум При попытке добавить коммент... (2014)
- Форум BUG: При добавлении комментария: «Deadlock detected» (2010)
- Форум [MySQL] кодировка передаваемых в процедуру параметров. (2011)
- Форум add_comment.jsp плюётся (2012)