Поле автоинкремента с триггером и последовательностью — проверьте, есть ли идентификатор в операторе [Postgres]

У меня есть этот образец из другой темы, и он идеально подходит для того, что мне нужно знать.

CREATE SEQUENCE AlimentosSequencia;

CREATE TABLE alimento (
  id integer NOT NULL PRIMARY KEY
 ,name VARCHAR(255));

 CREATE OR REPLACE FUNCTION AlimentoFuncion()
 RETURNS "trigger" AS
 $BODY$
 BEGIN
   New.id:=nextval('AlimentosSequencia');
   Return NEW;
 END;
 $BODY$
 LANGUAGE 'plpgsql' VOLATILE;

 CREATE TRIGGER AlimentosTrigger
 BEFORE INSERT
 ON alimento
 FOR EACH ROW
 EXECUTE PROCEDURE AlimentoFuncion();

 INSERT INTO alimento (name) VALUES ('lemon');

Это работает нормально! Но я должен дополнить функцию AlimentoFunction.

Есть ли способ проверить IN THE FUNCTION, размещает ли мой оператор вставки идентификатор?

Пример:

INSERT INTO alimento (name) VALUES ('lemon');

Хорошо, это работает... и если я сделаю это:

INSERT INTO alimento (id, name) VALUES (299, 'lemon');

Моя функция должна проверить, нужно ли использовать последовательность.

Я знаю, что могу установить значение ID по умолчанию как последовательность при создании таблицы, но я не могу изменить это. Я просто могу изменить функцию триггера.


person ComosGuy    schedule 01.02.2013    source источник


Ответы (1)


Что-то типа:

if new.id is NULL then 
   New.id:=nextval('AlimentosSequencia');
end if;
person a_horse_with_no_name    schedule 01.02.2013
comment
Я пробовал это, но я получил сообщение об ошибке, говорящее, что id не существует на новом. - person ComosGuy; 01.02.2013
comment
@ComosGuy: у меня работает: sqlfiddle.com/#!12/bffd9/1 какую версию Postgres вы используете? - person a_horse_with_no_name; 01.02.2013