2016-08-18 2 views
1

У меня есть следующий триггер, который должен назначать number сообщению каждый раз, когда новая запись будет вставлена ​​в таблицу posts. Он находит максимальный number от posts с областью до project_id новой записи.В запросе PostgreSQL нет адресата для данных результата

CREATE OR REPLACE FUNCTION assign_number() 
    RETURNS trigger AS 
    $BODY$ 
    BEGIN 
    SELECT coalesce(MAX(number), 0) max_number FROM posts WHERE project_id = NEW.project_id; 
    NEW.number := max_number + 1; 
    RETURN NEW; 
    END; 
    $BODY$ LANGUAGE plpgsql; 

    CREATE TRIGGER post_created 
    BEFORE INSERT ON posts 
    FOR EACH ROW 
    EXECUTE PROCEDURE assign_number(); 

К сожалению, я получаю ошибку синтаксиса query has no destination for result data при попытке сделать INSERT. Я пробовал все, что мог придумать, и посмотрел на каждый связанный с ним вопрос на StackOverflow, но все же, похоже, не в состоянии понять это.

Какие-либо идеи о том, что здесь не так? Что-нибудь очевидное, что мне не хватает?

+0

Вы забыли «INTO»? – Nicarus

ответ

2

Что-то совершенно очевидно, да. Вы не объявили переменную max_number и вы не использовали INTO пункт:

CREATE OR REPLACE FUNCTION assign_number() RETURNS trigger AS $BODY$ 
DECLARE 
    max_number integer; 
BEGIN 
    SELECT coalesce(MAX(number), 0) INTO max_number FROM posts 
    WHERE project_id = NEW.project_id; 
    NEW.number := max_number + 1; 
    RETURN NEW; 
END; 
$BODY$ LANGUAGE plpgsql; 

В качестве альтернативы, вы можете обойтись без переменной и поместить результат прямо в :

SELECT coalesce(MAX(number)+1, 1) INTO NEW.number FROM posts 
WHERE project_id = NEW.project_id; 

или даже:

NEW.number := (SELECT coalesce(MAX(number)+1, 1) FROM posts 
       WHERE project_id = NEW.project_id); 
+0

Спасибо! Я подумал, что это было нечто тривиальное. Это мой первый триггер. Недостатки в значительной степени зависят от ORM! –

+0

О да, ОРМ злые! Я делаю все свои присоединения и сложные запросы в PG и раскрываю их как обновляемое представление. ORM затем работает с простым отношением. Гораздо эффективнее и чисты. Удачи с просто-ванильным PG! – Patrick

Смежные вопросы