2

こういうことをしたいです。

PREPARE addFriend(INTEGER, INTEGER) AS
    INSERT INTO friendRelation (u_id, friendid) VALUES ($1, $2),
    INSERT INTO friendRelation (u_id, friendid) VALUES ($2, $1);

私はこれをドキュメントに表示していないので、実行できないか、間違って実行しています。準備されたステートメントに2つのクエリを含めることができない場合、これを実行できるpostgresの他の機能はありますか?

4

2 に答える 2

8

1つのプリペアドステートメントに複数のステートメントを含めることはできません…しかし、この特定のクエリは書き直すことができます。

PREPARE addFriend(INTEGER, INTEGER) AS
    INSERT INTO friendRelation (u_id, friendid) VALUES ($1, $2), ($2, $1);

または、同じことを行う関数を作成することもできます。

CREATE OR REPLACE FUNCTION addFriend(INTEGER, INTEGER) RETURNS VOID AS
$$
BEGIN
    INSERT INTO …;
    INSERT INTO …;
END
$$ LANGUAGE plpgsql;

CREATE LANGUAGE plpgsql;plpgsql言語をデータベースに追加するには、ある時点で実行する必要があることに注意してください。

于 2013-02-15T20:51:10.113 に答える
0

受け入れられた答えは部分的に正しいです。特定のケースでは、複数の行に対して1つの挿入を実行できます。ただし、複数の異なるクエリを実行する必要がある場合は、WITH構文を使用できます

WITH data_t (u1_id, u2_id) AS (
  VALUES($1::INTEGER, $2::INTEGER)
), inserted1 AS (
  INSERT INTO friendRelation (u_id, friendid) SELECT u1_id, u2_id FROM data_t
)
INSERT INTO friendRelation (u_id, friendid) SELECT u2_id, u1_id FROM data_t;
于 2017-11-13T16:03:49.313 に答える