2016-10-03 3 views
0

У меня есть таблица, которая содержит несколько строк для пользователя, удерживая их station_ids. Когда идентификатор станции изменяется с передней стороны с помощью кнопки раскрывающегося списка, я хочу обновить идентификатор станции в таблице. Я хочу, чтобы там всегда было одно значение TRUE для «is_default_station», но пользователь может иметь несколько значений FALSE. Я использую postgres 9.5 и диск PG для NodeJS.Функция обновления Postgres Custom

Моя таблица выглядит следующим образом:

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 не находит ничего внутри функции, но если я использую только первый запрос для обновления, я нахожу результаты и обновляю их, как ожидалось. Что мне не хватает?

+0

Что должно измениться от вашей функции? Какие аргументы вы предоставляете? Если вы запустите его как 'select update_all_stations_func (user_id, station_id) из user_stations', тогда результат будет произвольным. –

+0

Input = userId, stationId. Change = во-первых, установите для всех полей 'is_default_station' значение false на основе userId, переданного через вход, затем обновите значение' is_default_station' до значения true для станции, переданной через вход. Output = возвращает userId и обновленный файл stationId, возвращаясь в формат объекта. –

+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; 
Смежные вопросы