Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Использование последовательности в триггере


Автор: persalena 11.12.2011, 14:21
Здравствуйте! 

Я пытаюсь написать триггер, который будет генерировать идентификаторы для таблицы. Мне нужен именно триггер. Про то, что можно это сделать с помощью default, я знаю. Так вот, таблица у меня выглядит следующим образом:

Код

Create TABLE medicine
(
id_med smallint PRIMARY KEY,
id_type smallint NOT NULL,
id_form smallint NOT NULL,
name character(100) NOT NULL UNIQUE,
critcol integer NOT NULL
);


вот внешние ключи (если мало ли они как-то окажутся причастны..)

Код

ALTER TABLE medicine
ADD CONSTRAINT con1 FOREIGN KEY (id_type)
REFERENCES medtype (id_medtype)
ON DELETE CASCADE
ON UPDATE CASCADE;
ALTER TABLE medicine
ADD CONSTRAINT con2 FOREIGN KEY (id_form)
REFERENCES medform (id_medform)
ON DELETE CASCADE
ON UPDATE CASCADE;


Пишу последовательность:

Код

create sequence seq_1 increment by 1 start with 1;


Пишу триггер:

Код

create function func1() returns trigger as'
begin
NEW.id_med = nextval("seq_1");
return NEW;
end
'language plpgsql;

CREATE TRIGGER tr1
BEFORE INSERT ON medicine FOR EACH ROW
EXECUTE PROCEDURE func1();


Первое, что меня насторожило - то, что в nextval пришлось написать название последовательности в двойных кавычках.. во всех примерах было в одинарных.. Но в одинарных - не работает.. И, видимо из-за этих кавычек, когда я пытаюсь занести данные в таблицу, вылезает ошибка :

ERROR:  column "seq_1" does not exist
LINE 1: SELECT  nextval("seq_1")
                        ^
QUERY:  SELECT  nextval("seq_1")
CONTEXT:  PL/pgSQL function "func1" line 2 at assignment

Подскажите пожалуйста, что не так и как это исправить.

Автор: LSD 12.12.2011, 12:05
Попробуй так:
Код

create function func1() returns trigger as $$
begin
  NEW.id_med = nextval('seq_1');
  return NEW;
end
$$ language plpgsql;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)