Необходимо написать функцию, которая бы выдавала ИД записи, если такова существует или бы создавала новую запись и опять же возвращала бы ИД.
Попробовал такой вариант:
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)
 - Форум stored procedure Postgres (2004)
 - Форум BUG: При добавлении комментария: «Deadlock detected» (2010)
 - Форум [MySQL] кодировка передаваемых в процедуру параметров. (2011)