powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Merge в postgres
28 сообщений из 28, показаны все 2 страниц
Merge в postgres
    #38938357
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 2008 году merge приняли в состав стандарта. Почему его нет в postgres, который всегда соответствовал стандартам?
...
Рейтинг: 0 / 0
Merge в postgres
    #38938373
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraв 2008 году merge приняли в состав стандарта. Почему его нет в postgres, который всегда соответствовал стандартам?

Соответствие стандартам это не тоже самое что полная реализация стандарта. Полный даже ANSI SQL 1992 - он настолько обьемен и местами настолько дурной что целиком его не сделать (одни nchar/nvachar чего стоят... это я скажу как человек который в in-house разработке пытался это впилить в Postgresql для внутренних целей).

А вообще на счет совместимости смотрите тут: http://www.postgresql.org/docs/9.4/interactive/features.html


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Merge в postgres
    #38938378
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим, у меня такой задачи использовать merge не было. Он вообще нужен?
И да, я согласен, что в стандарте 92 года много того, что сейчас кажется абсурдным и в реализации ни мне, ни кому бы то ни было, не нужно и вряд ли будет нужно когда-нибудь
...
Рейтинг: 0 / 0
Merge в postgres
    #38938383
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraМаксим, у меня такой задачи использовать merge не было. Он вообще нужен?
И да, я согласен, что в стандарте 92 года много того, что сейчас кажется абсурдным и в реализации ни мне, ни кому бы то ни было, не нужно и вряд ли будет нужно когда-нибудь

Да merge бывает очень удобен. Но поскольку обычно это легко решалось костыльным триггером то особо никто не заморачивался (ибо очень геморойная реализация).
Насколько я понимаю в 9.5 он уже будет (судя по всему).

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Merge в postgres
    #38938440
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraне нужно и вряд ли будет нужно когда-нибудьОдин оператор заменяет блок по проверке существования записи, вставке или обновления, обработки коллизии, если этот же блок с тем же ключом идет в другой сессии, и повтор операции.
Подобный блок операторов корректно реализуют только процентов 10% разработчиков с опытом более года. Неплохой вопрос для собеседований по применению различных уровней изоляции.
...
Рейтинг: 0 / 0
Merge в postgres
    #38938453
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть один способ: https://pgolub.wordpress.com/2015/02/26/merge-in-postgresql/

Но нужно понимать, что он не атомарен. Как, впрочем, и мерж в оракле.
...
Рейтинг: 0 / 0
Merge в postgres
    #38938521
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нифига себе не нужен. Людей спросили?
http://postgresql.uservoice.com/forums/21853-general
топовый запрос!!
...
Рейтинг: 0 / 0
Merge в postgres
    #38938683
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakнифига себе не нужен. Людей спросили?
http://postgresql.uservoice.com/forums/21853-general
топовый запрос!!
дык
"у дураков мысли сходятся"
, евпочя

ах да, невольная рифма, простите , если обидел

вот чего действительно сложно на коленке собрать -- того бакланы и не просят

http://postgresql.uservoice.com/forums/21853-general/suggestions/1378161-insert-nowait-update-nowait#comments

без апдейта можно обойтись, эмулируется захватом записи. а вот с инсертом -- оно интереснее.
есть таки такие задачки ( ну или я люблю их себе придумывать -- захват ресурсов без ожидания)
...
Рейтинг: 0 / 0
Merge в postgres
    #38939620
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqвот чего действительно сложно на коленке собратьдля целок - pg_try_advisory_lock
...
Рейтинг: 0 / 0
Merge в postgres
    #38939627
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash GordonНо нужно понимать, что он не атомарен. Как, впрочем, и мерж в оракле.А как это проявляется в оракле?
...
Рейтинг: 0 / 0
Merge в postgres
    #38939665
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.qwwqвот чего действительно сложно на коленке собратьдля целок - pg_try_advisory_lockк сожалению, адвайзори локов в некотором смысле мало

или мало гладких отображений заранее открытого [под]мн-ва, пусть и весьма конечного , разных диапазонов разных лонгов на тот же лонг (или пару интов).

в некотором смысле -- таких отображений -- пустое множество. если не обрезать изначально множество, предназначаемое к отображению. (или не строить его динамически -- табличкой)

<...><...><...>, мр p2 [оценочное суждение] хехе
извиняюсь за резкость
...
Рейтинг: 0 / 0
Merge в postgres
    #38939723
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.,

Это важно, я объясню на примере:

Код: plsql
1.
2.
3.
create table merge_test(
  n_row   number primary key,
  n_value number);



Сессия 1:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
merge into merge_test   tgt
using(
  select 1   n_row
  from   dual)   src
on (tgt.n_row = src.n_row)
when matched then 
  update
  set    n_value = n_value + 1
when not matched then
  insert(
    n_row,
    n_value)
  values(
    src.n_row,
    1);



Сессия 2:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- то же самое
merge into merge_test   tgt
using(
  select 1   n_row
  from   dual)   src
on (tgt.n_row = src.n_row)
when matched then 
  update
  set    n_value = n_value + 1
when not matched then
  insert(
    n_row,
    n_value)
  values(
    src.n_row,
    1);
-- здесь сессия висит на блокировке по первичному ключу



Сессия 1:
Код: plsql
1.
commit;



Сессия 2:
Код: plsql
1.
2.
3.
4.
5.
6.
SQL Error: ORA-00001: нарушено ограничение уникальности (SCOTT.SYS_C00341716)
00001. 00000 -  "unique constraint (%s.%s) violated"
*Cause:    An UPDATE or INSERT statement attempted to insert a duplicate key.
           For Trusted Oracle configured in DBMS MAC mode, you may see
           this message if a duplicate entry exists at a different level.
*Action:   Either remove the unique restriction or do not insert the key.



Хотя из запроса понятно, что мы хотели бы другого — чтобы сессия 2 подождала, но обновила запись, созданную в сессии 1. Приведенный мной трюк с постгресом обладает таким же «приколом», просто в нем он более очевиден, а в оракле люди, не читавшие доку, потом задают вопросы . По сути, чтобы добиться требуемого поведения, нам нужно обрабатывать ошибку нарушения констрейнта, а это то, от чего мы хотим уйти.

Так как мерж уже стандартизован, а фичу просят регулярно, то на постгресовой вики есть страничка с парой десятков ссылок на тему: https://wiki.postgresql.org/wiki/SQL_MERGE . Например, там есть http://www.postgresql.org/message-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com]такая .
...
Рейтинг: 0 / 0
Merge в postgres
    #38939789
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash GordonХотя из запроса понятно, что мы хотели бы другого Это не Атомарность, а Iзоляция из букв ACID.
Да, не удовлетворяет похоти разработчика, хотя, в принципе, соответствует послаблению уровня repeatable read. Причем, доделать теоретически не сложно - сделать statement restart на изменение ключа (выполняя двойную, тройную,... работу), который сейчас приходится реализовывать вручную, если от проверки записи до ее insert/update произошли изменения. Но на множестве строк можно совсем запутаться...
Может потому и медлили в postgres, что хотят учесть эти недостатки...
...
Рейтинг: 0 / 0
Merge в postgres
    #38939792
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash Gordon<>
Хотя из запроса понятно, что мы хотели бы другого — чтобы сессия 2 подождала, но обновила запись, созданную в сессии 1. Приведенный мной трюк с постгресом обладает таким же «приколом», просто в нем он более очевиден, а в оракле люди, не читавшие доку, потом задают вопросы . По сути, чтобы добиться требуемого поведения, нам нужно обрабатывать ошибку нарушения констрейнта, а это то, от чего мы хотим уйти.
дык, типовая реализация с обработкой ексепшена на коленке валяется в пжшной доке с 8.0

http://www.postgresql.org/docs/8.0/static/plpgsql-control-structures.html#PLPGSQL-UPSERT-EXAMPLE

а триггерные вариации скорее всего с 7.x, где x<3
(вариант не без проблем , ессно, т.к. во многия уникъю -- многия печали)


но в большинстве случаев -- достаточно. и не только для целок, но и для весьма разработанных pi-рдаков
...
Рейтинг: 0 / 0
Merge в postgres
    #38939853
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.,

ну да, все это неразрывно связано с изоляцией и тем фактом, что в пг, как и в оракле, используется MVCC.

Может потому и медлили в postgres, что хотят учесть эти недостатки..

Я недаром там ссылку дал. Там как раз автор, который пишет/писал патч для пг рассуждает о проблемах. И становится понятно почему мержа до сих пор нету. Он прекрасно понимает, что в случае, который описал я, хотелось бы обойтись без эксепшенов, но это очень частный случай мержа — фактически это банальный UPSERT. Оператор же MERGE куда более развесист и изначально несет в себе много всяких краевых случаев, которые всплывают в ходе реализации. При этом эти случаи принципиально неустранимы и чем-то придется жертвовать, идти на компромисс. Поиск этих компромиссов и есть та самая сложность, которая отделяет нас от наличия апсерта/мержа в постгресе.

дык, типовая реализация с обработкой ексепшена на коленке валяется в пжшной доке с 8.0
Если она такая типовая, то пусть будет оператор, не так ли? Сразу отвечу: нет, потому что все сложно (см. выше).

Мне абсолютно понятно, что если руки не из задницы, то проблем не возникнет. Просто иногда хочется писать меньше шаблонного кода, если это возможно и уместно.
...
Рейтинг: 0 / 0
Merge в postgres
    #38939969
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PCContraМаксим, у меня такой задачи использовать merge не было. Он вообще нужен?


нет, не нужен.
полно СУБД, где его нет, и ничего.

вообще, в стандарте есть три части.

entry level, basic and extended.

(кажется не напутал)

все субд поддерживают entry level, он обязательный.

basic можно реализовывать частично, все СУБД так и делают. extended вообще не обязателен. Как правило его не делает никто.
Например, там описан язык процедурного расширения SQL, который у каждой СУБД просто свой.
...
Рейтинг: 0 / 0
Merge в postgres
    #38955158
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Merge в postgres
    #38955175
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash GordonВы не поверите http://www.postgresql.org/docs/devel/static/sql-insert.html

автор
Код: sql
1.
ON CONFLICT [ conflict_target ] conflict_action ]



ON CONFLICT Clause

The optional ON CONFLICT clause specifies an alternative action to raising a unique violation or exclusion constraint violation error. For each individual row proposed for insertion, either the insertion proceeds, or, if a constraint specified by the conflict_target is violated, the alternative conflict_action is taken.

conflict_target describes which conflicts are handled by the ON CONFLICT clause. Either a unique index inference clause or an explicitly named constraint can be used. For ON CONFLICT DO NOTHING, it is optional to specify a conflict_target; when omitted, conflicts with all usable constraints (and unique indexes) are handled. For ON CONFLICT DO UPDATE, a conflict target must be specified. Every time an insertion without ON CONFLICT would ordinarily raise an error due to violating one of the inferred (or explicitly named) constraints, a conflict (as in ON CONFLICT) occurs, and the alternative action, as specified by conflict_action is taken. This happens on a row-by-row basis.

A unique index inference clause consists of one or more column_name_index columns and/or expression_index expressions, and a optional index_predicate.



-- почти идеально. "я почему раньше злой был? -- потомучтаа у меня веласипеда не было"

вот только один из вариантов хотелось бы в стиле
Код: sql
1.
 ON [????] CONFLICT [RESTRICT] NO WAIT


-- [т.е. конфликт с "dirty" блокировками ресурса, а не с за-commit-ченными ONLY] вот тогда б это не лисапед был, а самое что ни на есть востребуемое. (конкурентная блокировка ресурсов без ожиданий)
но, навскидку, не нашёл
...
Рейтинг: 0 / 0
Merge в postgres
    #38955208
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще хотелось-бы ON CONFLICT несколько раз. Если юник констреинтов больше одного, то конфликты могут быть разные.
...
Рейтинг: 0 / 0
Merge в postgres
    #38956571
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во ребята замороченные)))
Подавай им MERGE, да ещё чтоб на конкурентных операциях не требовал
Код: sql
1.
LOCK TABLE <nametable> IN SHARE ROW EXCLUSIVE MODE;
...
Рейтинг: 0 / 0
Merge в postgres
    #38956594
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОКТОГЕНВо ребята замороченные)))
Подавай им MERGE, да ещё чтоб на конкурентных операциях не требовал
Код: sql
1.
LOCK TABLE <nametable> IN SHARE ROW EXCLUSIVE MODE;

ты, дядя, с кем сейчас разговаривал ?

-- мне то мерж в принципе не упал, а вот insert no wait [unique|key-fields] без каких либо лишних локов -- был бы желателен. и именно такое расширение этого велосипедика (мерде) -- я бы приветствовал.

А вот это всё я и руками могу, хотя и муторно немного.

но направление мысли радует.
а на случай варстоуна оно ещё и естественно напрашивается.
...
Рейтинг: 0 / 0
Merge в postgres
    #38956770
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash GordonВы не поверите http://www.postgresql.org/docs/devel/static/sql-insert.html
для кейсов без констрейнтов не подходит же
...
Рейтинг: 0 / 0
Merge в postgres
    #38956898
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan Durak,

ну тут причина в особенностях реализации. А можно привести такой кейс?
...
Рейтинг: 0 / 0
Merge в postgres
    #38957075
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash GordonIvan Durak,

ну тут причина в особенностях реализации. А можно привести такой кейс?
легко - мерж в таблицу без констрейнтов. Мерджем можно, инсертом с конфликтом нельзя - конфликтов нет
...
Рейтинг: 0 / 0
Merge в postgres
    #38957900
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan Durak,

А чем тогда не подходит тот вариант, что я выше приводил, с рекурсивным CTE?
...
Рейтинг: 0 / 0
Merge в postgres
    #38957903
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flash GordonIvan Durak,

А чем тогда не подходит тот вариант, что я выше приводил, с CTE?
...
Рейтинг: 0 / 0
Merge в postgres
    #38957905
Flash Gordon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Flash Gordon,

что-то я не смог в форум. В общем про слово «рекурсивный» меня переклинило, просто CTE.
...
Рейтинг: 0 / 0
Merge в postgres
    #38957909
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Flash GordonIvan Durak,

А чем тогда не подходит тот вариант, что я выше приводил, с рекурсивным CTE?
это другой способ, по разным причинам, но я про Insert on conflict говорил.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Merge в postgres
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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