Функция Postgres получает уникальное нарушение ограничения - PullRequest
0 голосов
/ 22 мая 2019

У меня есть plpgsql функция, содержащая это

update allplaces set visittime = now() where visittime is null and person = 'me' and place = 'this';
if (FOUND) then
    update allplaces set visittime = null where person = 'me' and place != 'this';
    return true;
else
    return false;
end if;

Таблица allplaces имеет уникальное ограничение как create unique index indexallplaces on allplaces (person) where visittime is not null, что означает, что у данного person может быть только 1 запись с visittime, которая не равна нулю.

Я пытаюсь переключить visittime с моей записи (person равно 'me'), которая была раньше (place равно любому), на ту, где place равно 'this', но Я получаю уникальное нарушение ограничения для уникального индекса, который я упомянул. Я не могу установить старое значение равным нулю, не изменив его, убедившись, что новое значение было установлено, следовательно, необходимо проверить if (FOUND).

Как я могу изменить эту функцию postgres для работы? Функция использует plpgsql, но это может быть и обычный SQL, если в этом случае это работает лучше.

EDIT

perform from allplaces where visittime is null and person = 'me' and place = 'this' and ...otherconditions...;
if (FOUND) then
    update allplaces set visittime = null where person = 'me';
    update allplaces set visittime = now() where person = 'me' and place = 'this' and ...otherconditions...;
    return true;
else
    return false;
end if;

1 Ответ

0 голосов
/ 22 мая 2019

Как насчет того, чтобы просто изменить запрос на использование регистра, подобного этому

update allplaces 
set visittime = case when place <> 'this' then null else now() end  
where person = 'me';

Это обновит все посещения с нулевым значением, кроме тех, где place = this. Это должно работать, учитывая, что на момент обновления есть только 1 строка (я, это)

...