Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Всем привет. Есть таблица Код: plaintext 1. 2. 3. 4. 5. 6. 7. Есть ХП Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Как в этой ХП получить в cls_id значение id только что вставленной в таблицу obj строки. При условии что поля name,comment,class могут быть не уникальными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 17:10 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 17:17 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 17:19 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
можно и "постфактум": сделать INSERT обычнам образом, т.е., без указания значения SERIAL-поля, а затем получить его текущее значение, вызвав функцию currval (по аналогии с nextval). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2006, 18:45 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Если не ошибаюсь, то "постфактум" лучше не делать. :-) Может так получиться, что между операцией вставки и операцией получения текущего значения последовательности это текущее значение изменится. Т.к. последовательность одна для всех транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2006, 19:37 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Можно делать и curval - если вы просто напишете curval без вставки - вам выдаст ошибку - следовательно curval действует в пределах транзации и только после insert - если уровень изоляции транзакций по умолчанию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2006, 22:13 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
curval выдает последнее выделенное значение последовательности в текущей транзакции и абсолютно безопасен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:01 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Funny_Falconcurval выдает последнее выделенное значение последовательности в текущей транзакции и абсолютно безопасен.не совсем точно currval Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Notice that because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did. а "сессия" и "транзакция" - вещи разные. например вполне работает в одном окне pgAdmina: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 11:14 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Сори, облажался. Но и смысла запрашивать curval, если случился rollback не вижу (думаю и не бывает так Ж-) По-этому curval так и остается безопасным (если прямыми руками использовать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 17:49 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Не остается. Скажем, пока ты выполнял операцию вставки, джедай в соседней транзакции вызовет nextval. И currval вернет тебе не твое значение, а приросшее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 20:56 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Кувалдин РоманНе остается. Скажем, пока ты выполнял операцию вставки, джедай в соседней транзакции вызовет nextval. И currval вернет тебе не твое значение, а приросшее. Currval выдаст most recently obtained by nextval for this sequence in the current session . А не в "чужой" сессии. Не се па? Или я глубоко заблудился? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2006, 22:16 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Не, это я облажался :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2006, 08:34 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
не, ну я могу придумать, как кажецца можно навернуть логику с каррвал. Скажем - завести глобальный уникальный индификатор уровня базы на счетчике, а по вставке в какую-то табличку вызывать триггер "до вставки", порождающий вставку в другую табличку неких служебных объектов (т.е. в свою очередь наваривающих этот же глобальный уникальный индификатор. дальше вроде все понятно но это довольно искусственный пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2006, 10:30 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
логику с некствал, я так понял тоже можно навернуть. Так что особой разницы между курвал и некствал нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2006, 17:10 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
аналогичная проблема, но с тем, что есть UNIQUE поля. После INSERT-а (если он не удачен, т.е. UNIQUE VIOLATION по какому-то полю) - как получить id (serial) записи, которая вызвала VIOLATION? SELECT не предлагать. Не верю, что нельзя получить все поля записи, на которой возник UNIQUE VIOLATION без SELECT-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 13:59 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
victor_krЕсли не ошибаюсь, то "постфактум" лучше не делать. :-) Может так получиться, что между операцией вставки и операцией получения текущего значения последовательности это текущее значение изменится. Т.к. последовательность одна для всех транзакций. аналогично и nextval <здесь кто-то может влезть> insert ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 14:28 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Winnipuhаналогично и nextval <здесь кто-то может влезть> insertЕсли получили номер с помощью nextval никто уже не влезет и не заберет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 14:39 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Начиная с версии 8.2 появилась возможность сделать это без nextval() или currval() с помощью "INSERT ... RETURNING ...". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 15:02 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatНачиная с версии 8.2 появилась возможность сделать это без nextval() или currval() с помощью "INSERT ... RETURNING ...". это хорошо работает только если не возникло UNIQUE VIOLATION. При вставке с возникновением UNIQUE VIOLATION значение не возвращается. Неужели без select-а никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 17:38 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Robert Ayrapetyanэто хорошо работает только если не возникло UNIQUE VIOLATION. При вставке с возникновением UNIQUE VIOLATION значение не возвращается. Неужели без select-а никак? Поясните свой вопрос примером. Мне, например, сложно понять, что именно Вы хотите получить и в каком виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 18:18 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Имеется таблица ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 18:35 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Имеется таблица: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Выполняется INSERT INTO families(FamilyName) VALUES (blablalba); Необходимо: получить FamilyID в той записи, которая была вставлена, либо сгенерировала DUPLICATE VIOLATION. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 18:39 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Robert Ayrapetyan Необходимо: получить FamilyID в той записи, которая была вставлена, либо сгенерировала DUPLICATE VIOLATION.очевидно, при ошиппке никакого FamilyID сгенерено не будет. ПО части наращивания счетчика, если произошло, спрашиваейте curval. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 18:54 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
INSERT ... RETURNING ... не годится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 13:33 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Nick GazaloffINSERT ... RETURNING ... не годится? Чукча не читатель .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 13:48 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
авторINSERT ... RETURNING ... не годится? блин, ну сколько раз можно одно и то же! Повторяю в последний раз: INSERT... RETURNING возвращает значение только когда вставка прошла удачно. При неудачной (UNIQUE VIOLATION) возвращается NULL Ок, я понял что без select-а после insert-а не обойтись (что есть очень херово). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 14:03 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Robert Ayrapetyan Ок, я понял что без select-а после insert-а не обойтись (что есть очень херово). Простите, но зачем вам ID после UNIQUE VIOLATION? Что вы с ним будете делать апосля? Опять же, если очень надо, то 4321 верно сказал: юзайте CURVAL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 14:12 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Robert AyrapetyanОк, я понял что без select-а после insert-а не обойтись (что есть очень херово).Не понятно, какой именно select вы имеете в виду, поясните плиз на вашем примере с таблицей families. И еще вопрос: командой инсерт вы пытаетесь вставить одну строку или несколько? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 14:46 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
авторПростите, но зачем вам ID после UNIQUE VIOLATION? Что вы с ним будете делать апосля? Опять же, если очень надо, то 4321 верно сказал: юзайте CURVAL... Существуют таблицы и ключи: Код: plaintext 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. Есть функция по добавлению новых записей в fn, которая в настоящий момент выглядит так: Код: plaintext 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. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Необходимость исопльзовать идиотскую конструкцию с flag из-за того, что: 1. Невозможно использовать FOUND (в любом случае он равен 1) 2. Невозможно использовать GET DIAGNOSTICS integer_var = ROW_COUNT; т.к. ROW_COUNT также равен нулю. Но вопрос в другом (но был бы рад избавиться от flag). Как получить xxx_ID в Exception БЕЗ select-а??? Currval тут поможет (и используется в процедуре выше) только если вставка прошла удачно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 15:14 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Скажите, а что это: flag = 1; ??? Странная булева алгебра ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 15:53 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Или pl/sql стал понимать сишные присвоения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 15:54 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Как насчет избавиьтся от flag и currval? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Видимо вам подошло бы "UPSERT RETURNING". Смотри UPSERT в TODO . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 16:18 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
авторИли pl/sql стал понимать сишные присвоения? а когда он их не понимал? авторКак насчет избавиьтся от flag и currval? понимаете, база все время растет, и делать SELECT для каждого INSERT-а из набирающей каждый день миллионы записей базы не хочется. Использование в данном случае currval ускоряет процесс в несколько раз (для тех случаев, когда нет DUPLICATE VIOLATION). Проблема в том, что я не знаю (и пока никто не подсказал) как вытащить нужное мне поле при DUPLICATE VIOLATION (без select-а есесно). Я 100% уверен что есть решение, просто никто почему-то не сталкивался (хотя на мой взгляд все просто забили и использовали неэффективный SELECT, такая проблема встречается в каждой второй БД). авторВидимо вам подошло бы "UPSERT RETURNING". Смотри UPSERT в TODO. Незнаю, это все решение другой проблемы. Моя задача - достать поля из записи, которая сгенерячила DUPLICATE VIILATION при INSERT-е без SELECT-а. Сомневаюсь что UPSERT будет такое возвращать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2007, 18:24 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Не примите за наезд, но действительно SELECT _сразу после_ DUPLICATE VIOLATION не эффективен ? Тесты это доказывают ? Я просто подумал что после DUPLICATE VIOLATION возможно запись уже в кеше и возможно SELECT для неё отработает мгновенно ? хотя может я ошибаюсь... -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2007, 02:23 |
|
||
|
вытянуть из insert значение вставленно по умолчанию
|
|||
|---|---|---|---|
|
#18+
Robert Ayrapetyanделать SELECT для каждого INSERT-а из набирающей каждый день миллионы записей базы не хочется.При селекте выполняется выборка одной записи по уникальному индексу? И это работает медленно? Сколько миллисекунд? Robert AyrapetyanИспользование в данном случае currval ускоряет процесс в несколько разПопробуйте реализовать алгоритм "SELECT || INSERT RETURNING", в этом случае не в каждом случае будет выполняться INSERT, что возможно даст гораздо более существенное ускорение, чем "currval vs select". Robert AyrapetyanПроблема в том, что я не знаю (и пока никто не подсказал) как вытащить нужное мне поле при DUPLICATE VIOLATION (без select-а есесно). Я 100% уверен что есть решениеА может и нет решения. Не сделали разработчики постгреса соответствующего интерфейса, нет и решения. Robert Ayrapetyan авторВидимо вам подошло бы "UPSERT RETURNING". Смотри UPSERT в TODO.Незнаю, это все решение другой проблемы. Моя задача - достать поля из записи, которая сгенерячила DUPLICATE VIILATION при INSERT-е без SELECT-а. Сомневаюсь что UPSERT будет такое возвращать.Вроде UPSERT RETURNING вам бы подошел: "MERGE INTO families AS a USING families AS b ON b.FamilyValue=$FamilyValue WHEN NOT MATCHED THEN INSERT (a.FamilyValue) VALUES ($FamilyValue) RETURNING FamilyID". (Синтаксис придумал сам на основе SQL2003//MERGE и PG8.2//RETURNING.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2007, 11:16 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=2005156]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 407ms |

| 0 / 0 |
