powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT OR UPDATE
12 сообщений из 12, страница 1 из 1
INSERT OR UPDATE
    #39623118
band-rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день, срочно нужна помощь.
есть код, к примеру:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH upsert AS (
     UPDATE tab_1 SET field_1 = text
     WHERE tab_1_id = 1
     RETURNING *
)
INSERT INTO tab_1 (tab_1_id, field_1) 
SELECT 1, 'text'
WHERE NOT EXISTS (SELECT * FROM upsert)
RETURNING tab_1_id 


При INSERT INTO возвращает tab_1_id, а при UPDATE не хочет.
Необходимо что-бы в любом случае RETURNING возвращал tab_1_id
Спасибо.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623126
Alex__kK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
band-rk,

из виза во вне вроде не умеет. Пусть коллеги поправят, если я неправ
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623132
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
band-rk,

c 9.5 появилась конструкция insert .. on conflict update , я думаю намного лучше будет ее использовать.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623133
band-rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexius,
Я читал доки, но к сожалению нет возможности проопдейтить postgre, поэтому нужно что нить придумать со старым вариантом.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623153
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
band-rk,

просто склейте два cte:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH upd AS (
     UPDATE tab_1 SET field = 'text'
     WHERE tab_1_id = 1
     RETURNING *
), ins as (
INSERT INTO tab_1 (tab_1_id, field) 
SELECT 1, 'text'
WHERE NOT EXISTS (SELECT * FROM upd)
RETURNING tab_1_id 
) 
select tab_1_id from upd union select tab_1_id from ins;



Есть race condition.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623164
band-rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,
О!, огромное человеческое спасибо, что то не додумался.
Все получилось.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623183
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
band-rk,

к сожалению, корректная реализация upsert в версиях до 9.5 предполагает использование хранимки с циклом внутри (см. пример merge_db в документации ). тут можно почитать, почему не так все просто.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623189
band-rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexius,

Спасибо за информацию, в данный момент я реализую как посоветовал Melkij. Но при первой возможности обновлюсь до 9.6 и переделаю запрос.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623529
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiusband-rk,

к сожалению, корректная реализация upsert в версиях до 9.5 предполагает использование хранимки с циклом внутри (см. пример merge_db в документации ). тут можно почитать, почему не так все просто.

а что, очередь на хеш(ключа) и тейблоид не пройдёт. всегда думал что должно получаться через адвайзори локи . и всегда было лень.
-- берем первым селектом виза лок на пару ключ, таблица, и выполняем далее апдейт с котятами . пришедший вторым будет ждать (если такой же конструкции). тонкий момент -- какой снепшот он, этот with cte, будет видеть после разлока очереди. тот с которым взял ресурс ? или не очень . что-то начинаю вспоминать. что что-то такое на ту же тему проверял. результата не помню.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623544
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

да, с advisory lock'ами вариант я думаю рабочий, но "неаккуратно как-то") не приходилось пока с такой реализацией сталкиваться. снепшот по идее должен быть тот же, с которым лок брался, если это один запрос.
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623550
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexius,

advisory lock хотя бы не lock table, как некоторые делают =)
...
Рейтинг: 0 / 0
INSERT OR UPDATE
    #39623554
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiusqwwq,

"неаккуратно как-то"
колхоз конечно.
поэтому и не помню.

да и если всех построить строго в адвайзори -- их на всех не хватит.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT OR UPDATE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]