2016-08-18 50 views
1

我有以下觸發器,應該在每次將新記錄插入到posts表中時將number分配給一個帖子。它發現posts的最大number範圍爲新記錄的project_idPostgreSQL查詢沒有結果數據的目的地

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(); 

不幸的是,試圖做一個INSERT時,我得到的語法錯誤query has no destination for result data。我試過了我能想到的所有東西,並查看了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

哦,是的,ORMs是邪惡的!我在PG中完成所有的加入和複雜查詢,並將它們公開爲可更新的視圖。然後ORM使用簡單的關係。更高效和乾淨。用普通香草PG祝你好運! – Patrick

相關問題