自定义Postgres更新功能

时间:2016-10-03 19:15:25

标签: postgresql

我有一个表,其中包含用户的多行,并保存了他们的station_ids。当通过下拉按钮从前端更改站ID时,我想更新表中的站ID。我只希望“is_default_station”的值为TRUE值,但用户可以有多个FALSE值。我正在使用postgres 9.5和NodeJS的PG驱动器。

我的表格如下:

  station_id     | station_name                |        user_id          |   is_default_station
-----------------+---------------------------- +-------------------------+--------------------------
    1            |  station 1                  |     1                   |          TRUE
    2            |  station 2                  |     1                   |          FALSE
    3            |  station 3                  |     1                   |          FALSE
    4            |  station 4                  |     2                   |          FALSE 
    5            |  station 5                  |     2                   |          FALSE 
    6            |  station 6                  |     2                   |          TRUE            

这是我的功能:

CREATE OR REPLACE FUNCTION UPDATE_All_STATIONS_FUNC (
userId INTEGER,
stationId INTEGER
)
RETURNS RECORD AS $$
DECLARE
  ret RECORD;
BEGIN
--Find all the user stations associated to a user, and set them to false. Then, update one to TRUE
UPDATE user_stations SET (is_default_station) = (FALSE) WHERE station_id = ALL (SELECT station_id FROM user_stations WHERE user_id =$1 AND is_default_station = TRUE);
UPDATE user_stations SET (is_default_station) = (TRUE) WHERE station_id =$2 AND user_id = $1 RETURNING user_id, station_id INTO ret;
RETURN ret;
END;
$$ LANGUAGE plpgsql;

我正在访问这样的函数:

SELECT user_id, station_id FROM update_all_stations_func($1, $2) AS (user_id INTEGER, station_id INTEGER)

该函数不会更新数据库上的任何内容,并返回user_id和station_id的空值,如rows: [ { user_id: null, dashboard_id: null } ]

我猜测嵌套SELECT的初始更新查询没有在函数中找到任何,但如果我单独使用第一个查询进行更新,我会找到结果并按预期更新。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我简化了第一个更新语句,以下内容按预期工作:

CREATE OR REPLACE FUNCTION UPDATE_All_STATIONS_FUNC (
userId INTEGER,
stationId INTEGER
)
RETURNS RECORD AS $$
DECLARE
  ret RECORD;
BEGIN
--Find all the user stations associated to a user, and set them to false. Then, update one to TRUE
UPDATE user_stations SET (is_default_station) = (FALSE) WHERE user_id = $1 AND station_id <> $2;
UPDATE user_stations SET (is_default_station) = (TRUE) WHERE user_id = $1 AND station_id = $2 RETURNING user_id, station_id INTO ret;
RETURN ret;
END;
$$ LANGUAGE plpgsql;