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

一个准备好的语句不能包含多个语句……但是这个特定的查询可以重写:

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

接受的答案部分正确,在您的特定情况下,您可以为多行运行一次插入。但是如果您需要运行多个不同的查询,您可以使用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 回答