У меня есть таблица, которая содержит несколько строк для пользователя, удерживая их 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 не находит ничего внутри функции, но если я использую только первый запрос для обновления, я нахожу результаты и обновляю их, как ожидалось. Что мне не хватает?
Что должно измениться от вашей функции? Какие аргументы вы предоставляете? Если вы запустите его как 'select update_all_stations_func (user_id, station_id) из user_stations', тогда результат будет произвольным. –
Input = userId, stationId. Change = во-первых, установите для всех полей 'is_default_station' значение false на основе userId, переданного через вход, затем обновите значение' is_default_station' до значения true для станции, переданной через вход. Output = возвращает userId и обновленный файл stationId, возвращаясь в формат объекта. –
Редактировать свой вопрос. Обеспечьте примерный вызов функции и ожидаемого вывода. –