|
Не работает (WITH + UPSERT + UPDATE)
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4.
Здесь вложенный в WITH запрос работает корректно (обновляет существующую запись с id = 2 и возвращает эту запись главному запросу). Главный запрос у полученной записи с id = 2 должен изменить name . Но главный запрос ничего не меняет. Если условие (test.id = upsert.id) заменить на (test.id <> upsert.id), то главный запрос меняет name у всех записей, кроме id = 2 . Т.е. условие (test.id = upsert.id) срабатывет, но запись ( name ) не меняется. Бред какой-то... P.S . Очевидно, что если два запроса выполнить отдельно, проблем не будет. Но в случае с WITH происходит какая-то петрушка... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2021, 02:47 |
|
Не работает (WITH + UPSERT + UPDATE)
|
|||
---|---|---|---|
#18+
Cyrax_02, Как обычно внимательно читаем документацию в части https://www.postgresql.org/docs/13/queries-with.html#QUERIES-WITH-MODIFYING Особенно предпоследний абзац звучащий как: документацияTrying to update the same row twice in a single statement is not supported. Only one of the modifications takes place, but it is not easy (and sometimes not possible) to reliably predict which one. This also applies to deleting a row that was already updated in the same statement: only the update is performed. Therefore you should generally avoid trying to modify a single row twice in a single statement. In particular avoid writing WITH sub-statements that could affect the same rows changed by the main statement or a sibling sub-statement. The effects of such a statement will not be predictable. почему так - написано выше по тексту. В общем результат unspecified и так делать не надо. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2021, 10:02 |
|
Не работает (WITH + UPSERT + UPDATE)
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6.
Тогда получается, что одним запросом никаким способом невозможно выполнить последовательные UPSERT + UPDATE на одной и той же строке ? Maxim BogukОсобенно предпоследний абзац звучащий как:Этот абзац я читал. Только вот под оператором я понимал одну несоставную команду (в данном случае UPSERT или UPDATE). Как оказалось, речь идёт в т.ч. и о составных командах. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2021, 14:28 |
|
Не работает (WITH + UPSERT + UPDATE)
|
|||
---|---|---|---|
#18+
Cyrax_02 Код: sql 1. 2. 3. 4. 5. 6.
Тогда получается, что одним запросом никаким способом невозможно выполнить последовательные UPSERT + UPDATE на одной и той же строке ? Maxim BogukОсобенно предпоследний абзац звучащий как: Как оказалось, речь идёт в т.ч. и о составных командах. Одним запросом - нельзя без использования хранимых процедур. WITH это одна монолитная команда а не составная... составная команда это когда несколько sql запросов в одной строке отправляются через ; . Никогда не стоит смешивать в голове WITH c несколькими блоками и несколько sql комманд через ; - это очень разные вещи и работают по разному. PS: не могу понять в каком реальном use case вам такая странная задача понадобилась. Обычно подобные вещи через BEFORE триггер решаются. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2021, 17:53 |
|
Не работает (WITH + UPSERT + UPDATE)
|
|||
---|---|---|---|
#18+
Maxim BogukWITH это одна монолитная команда а не составная... Под " составной командой " в предыдущем посте я имел ввиду многоблочную команду с WITH , а не " запрос; запрос ; ...". Maxim BogukPS: не могу понять в каком реальном use case вам такая странная задача понадобилась. Обычно подобные вещи через BEFORE триггер решаются. Подобные - это какие ? Выполнение BEFORE-триггером операции INSERT или UPDATE в зависимости от значений полей (для этого есть UPSERT) ? Сабжевый пример с точки зрения логики абсолютно бессмыслен (упрощённая форма реального запроса, воспроизводящая проблему). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2021, 19:50 |
|
Не работает (WITH + UPSERT + UPDATE)
|
|||
---|---|---|---|
#18+
Cyrax_02 Maxim BogukPS: не могу понять в каком реальном use case вам такая странная задача понадобилась. Обычно подобные вещи через BEFORE триггер решаются. Сабжевый пример с точки зрения логики абсолютно бессмыслен (упрощённая форма реального запроса, воспроизводящая проблему). такие это когда надо сложную логику реализовать перед тем как менять что то в таблице в вашем случае это "выполнить последовательные UPSERT + UPDATE надо одной строкой в пределах 1 запроса" -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2021, 20:40 |
|
|
start [/forum/topic.php?fid=53&fpage=18&tid=1994283]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 128ms |
0 / 0 |