2016-08-18 38 views
1

新しいレコードがpostsテーブルに挿入されるたびにnumberを投稿に割り当てる予定の次のトリガがあります。新しいレコードのproject_idに範囲が最大numberpostsが見つかりました。残念ながら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(); 

INSERTをしようとするとき、私は構文エラーquery has no destination for result dataを取得します。私は考えることができるすべてを試して、StackOverflowのすべての関連する質問を見ましたが、まだこれを理解できないようです。

ここに間違いがありますか?私が行方不明になっていることは明らかです。

+0

あなたは 'INTO'を忘れていますか? – Nicarus

答えて

2

何かかなり明白です。はい。

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; 

また、あなたが変数なしで行うとストレートに結果を配置することができます:あなたは、変数max_numberを宣言されていないし、あなたがINTO句を使用していない持って

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

ああ、ORMは悪です!私はすべての私の参加し、PGで複雑なクエリを行い、それらを更新可能なビューとして公開します。 ORMは単純な関係で動作します。はるかに効率的で清潔です。プレーンバニラPGで幸運を祈る! – Patrick

関連する問題