Необходимо написать функцию, которая бы выдавала ИД записи, если такова существует или бы создавала новую запись и опять же возвращала бы ИД.
Попробовал такой вариант:
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
Поскольку сам с функциями в постгресе ещё не до конца разобрался, прошу коллективной помощи :)