|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
Задача, найти в таблице нужную запись и вернуть ее ID. Если записи нет, то вставить новую и вернуть ID новой записи. Хотел сделать через MERGE Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Для новой записи ID возвращает, для существующей возвращает NULL. Можно что-то подправить? Новая запись будет вставляться крайне редко. В основном это будет выборка существующей С уважением, Vasilisk ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:40 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_, а не пробовали: Код: sql 1. 2.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:52 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Код: sql 1.
это пропускает парсер? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:55 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
KreatorXXI, Token unknown - line 56, column 9. RETURNING. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:56 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
а) Если это PSQL, то достаточно перед MERGE присвоить значение Код: sql 1.
б) Более универсально Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:57 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
Мимопроходящий это пропускает парсер? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:57 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
12.03.2020 16:57, _Vasilisk_ пишет: >> это пропускает парсер? > > Да > круто! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 16:59 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad а) Если это PSQL, то достаточно перед MERGE присвоить значение Код: sql 1.
По сути у меня такая логика Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:02 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
12.03.2020 17:02, _Vasilisk_ пишет: > По сути у меня такая логика [...] а не проще так и сделать? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:10 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Я ищу по val, а возвращаю id. Но тогда, если val не уникален, запрос может не быть singleton и будут проблемы. Это и SELECT'а касается - нужно FIRST или ROWS добавлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:23 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
Мимопроходящий а не проще так и сделать? hvlad Но тогда, если val не уникален ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:36 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
12.03.2020 17:36, _Vasilisk_ пишет: > Возможна параллельная работа. Когда запись появится из соседнего коннекта после проверки, но до вставки. нет ограничения на эту запись по PK или UNIQUE? отлуп по SNAPSHOT-у не устраивает? > Придется навешивать дополнительные проверки. А хотелось одним запросом не знаю как там у MERGE с CURSOR STABILITY. зуб не дам. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:43 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
Сделал так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Если на момент поиска запись есть, то SELECT вернет ее ID. Если же не было, но появилась, тогда один раз выполнится WHEN MATCHED THEN UPDATE SET и ID вернется через RETURNING. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:44 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
Мимопроходящий нет ограничения на эту запись по PK или UNIQUE? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:45 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_Возможна параллельная работа. Когда запись появится из соседнего коннекта после проверки, но до вставки. Придется навешивать дополнительные проверки. А хотелось одним запросом ты же и так этот запрос выполняешь внутри ХП, иначе какой нафиг INTO :var_res Какая разница сделано оно одним запросом внутри хранимки или несколькими? До 4.0 чтобы не нарваться на неприятности делай в snapshot транзакции. В 4.0 можно и в RC. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:46 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
12.03.2020 17:45, _Vasilisk_ пишет: > > Есть. Но не хотелось вешать дополнительную обработку исключений > но ведь ты же пользуешься семафорами и критическими секциями в Дельфях, так отчего же в здесь не юзать подобные штатные конструкции ;) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 17:47 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Если на момент поиска запись есть, то SELECT вернет ее ID. Если же не было, но появилась ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 19:48 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_А хотелось одним запросом это один запрос с точки зрения SQL, но совсем не одно действие с точки зрения движка сервера. Даже простой update сначала ищет запись, а потом ее уже обновляет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.03.2020, 21:03 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
kdv Даже простой update сначала ищет запись, а потом ее уже обновляет. hvlad Ты правда думаешь, что это спасёт тебя от нарушений уникальности или конфликтов обновления при параллельной работе ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 16:01 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Т.е. банальный INSERT OR UPDATE запущенный в двух потоках может мне задублировать записи? Если есть - придётся иметь дело с обработкой ошибки. Я тебе что-то новое сейчас сказал ? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 16:15 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad Если есть - придётся иметь дело с обработкой ошибки. Код: sql 1.
поможет? hvlad Я тебе что-то новое сейчас сказал ? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 16:44 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Код: sql 1.
поможет? _Vasilisk_ hvladЯ тебе что-то новое сейчас сказал ? ;) Что два параллельных апдейта могут конфликтовать ? Или что тр-ции изолированны друг от друга и есть разные уровни оной изолированности ? Или что жизнь сложнее, чем хотелось бы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 16:57 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad Не понял. Что ты хочешь узнать ? Что два параллельных апдейта могут конфликтовать ? Для упрощения пусть конкурирующие транзакции будут READ COMMITED. В смысле я допускаю возможность ошибку типа deadlock. Когда мы пытаемся проапдейтить незакоммиченную запись в no wait транзакции. Но не дубликат ключа ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:15 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Да. Что операция UPDATE OR INSERT не атомарна. Но тебе, похоже, нужно сначала понять - что такое атомарность. И что такое изолированность. Потом почитай про консистентность (согласованность). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:22 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad Она атомарна. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:23 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ hvlad Она атомарна. Будет сообщение об ошибке. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:24 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad Будет сообщение об ошибке. Давай детальнее. Таблица Код: sql 1. 2. 3. 4. 5. 6. 7.
И из двух параллельных транзакций с параметрами rec_version, read_committed, wait выполняется запрос Код: sql 1. 2. 3.
Если операция атомарна, то откуда возьмется ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:35 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Если операция атомарна И что такое изолированность ? Каким боком вторая тр-ция узнает о том, что первая что-то вставила, если ей нельзя видеть незакомиченное ? Может уже изучить азы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:40 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
LangRef 3.0Столбцы идентификации (автоинкремент) Столбцы идентификации могут быть определены с помощью предложения GENERATED BY DEFAULT AS IDENTITY. Столбец идентификации представляет собой столбец, связанный с внутренним генератором последовательностей.Ключевое я подчеркнул. Генератор - вне транзакций и обращение к нему выстраивает (в) очередь. Следовательно, если не задавать значение руками (а зачем бы, в нормальной ситуации), то две любые вставки гарантированно получат два разных значения для поля с автоинкрементом. На атомарность и изоляцию это всё не влияет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 17:48 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad Что такое атомарность, по твоему ? hvlad Каким боком вторая тр-ция узнает о том, что первая что-то вставила, если ей нельзя видеть незакомиченное ? Сейчас провел эксперимент. 1. Стартуем транзакцию 2. Выполняем Код: sql 1. 2. 3.
3. получаем 1 record(s) was(were) inserted into MYTABLE4. Стартуем вторую транзакцию 5. Выполняем Код: sql 1. 2. 3.
получаем Invalid insert or update value(s): object columns are constrained - no 2 table rows can have duplicate column values. violation of PRIMARY or UNIQUE KEY constraint "UNQ_MYTABLE_VAL" on table "MYTABLE". Problematic key value is ("VAL" = 1).Т.е. изолированности транзакции хватает на то, чтобы не найти запись при поиске, но найти при попытке вставить и выкинуть ошибку дубликата. Т.е. тут вопрос даже не в атомарности. Т.к. сейчас никакого race condition нет. Есть обычный конкурентный допуск ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 18:09 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_, Влад сказал что при отсутствии ограничения уникальности, отсутствие дубликатов таким оператором не гарантируется. У тебя оно есть о чём и говорит ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 18:37 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
Симонов Денис Влад сказал что при отсутствии ограничения уникальности, отсутствие дубликатов таким оператором не гарантируется. Симонов Денис У тебя оно есть о чём и говорит ошибка. _Vasilisk_ изолированности транзакции хватает на то, чтобы не найти запись при поиске, но найти при попытке вставить и выкинуть ошибку дубликата. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 18:43 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_, транзакции изолированы друг от друга. Ну не может вторая транзакция увидеть запись, которая вставила первая, но не подтвердила вставку. Что тут удивительного? Проверка ограничения уникальности производится вне контекста транзакции, поэтому ты получаешь ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 18:53 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ hvladЧто такое атомарность, по твоему ? Нет никакого "момента выполнения конкретного оператора". Вообще всё не так. Срочно читать определение ACID. _Vasilisk_ Сейчас провел эксперимент. 1. Стартуем транзакцию 2. Выполняем ... 4. Стартуем вторую транзакцию 5. Выполняем Не думал о том, что 2 и 5 в жизни могут выполняться "одновременно", а не после того, как ты нажмёшь enter ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 19:05 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
hvlad Не думал о том, что 2 и 5 в жизни могут выполняться "одновременно", а не после того, как ты нажмёшь enter ? Симонов Денис Проверка ограничения уникальности производится вне контекста транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 19:18 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_ Симонов Денис Проверка ограничения уникальности производится вне контекста транзакции Вообще-то ответу больше лет, чем моему опыту работы с IB-FB. И не только по факту реализации, но и в обсуждениях на всякоразных ресурсах. Почему снова и снова это становится откровением даже для вовсе не неофитов - для меня загадка. Был случАй, когда мне пришлось это объяснять аж Хелен ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 19:59 |
|
Найти запись или вставить
|
|||
---|---|---|---|
#18+
_Vasilisk_, последний раз говорю - изучай основы. Без них - никуда. Я могу расжевать тебе этот конкретный случай, но не буду. Ибо это тебя ничему не научит. Появится понимание основ, появятся нетривиальные вопросы - приходи, поговорим. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 20:00 |
|
|
start [/forum/search_topic.php?author=OEL&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
134ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 646ms |
total: | 908ms |
0 / 0 |