Может быть несколько параллельных запросов к API, каждый из которых предоставляет идентификатор и свой индекс, поэтому невозможно просто заменить старые данные новыми.
Это единственное, что возможно в PostgreSQL. Отдельные компоненты JSONB не могут быть отредактированы на месте, вам нужно извлечь старое значение JSONB, изменить его и заменить новым.
Вы, вероятно, можете делать то, что хотите, с помощью jsonb_set .
update mytable set myjsonb=jsonb_set(myjsonb,'{items,3}','"id3"') where myid=6
Но это, вероятно, не сработает так, как вы хотите, если индекс, который вы пытаетесь установить, находится за пределами существующего массива более чем на одно значение.
Если вы хотите выполнять манипуляции на клиентском языке, вам придется заблокировать строку, чтобы никто другой с целью написания не мог прочитать устаревшее значение и думать, что он может с ним работать.
BEGIN;
select myjsonb from mytable where myid=6 for update;
<do stuff here in the client>
update mytable set myjsonb=:newvalue where myid=6;
COMMIT;