|
Найти запись или вставить
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=40&tid=1560410]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
133ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 258ms |
0 / 0 |