|
|
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
Доброго, дня всем! Прошу помощи с написанием запроса... имеется таблица Код: plaintext добавляем записи: Код: plaintext 1. 2. Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 14:44 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV, А нельзя сделать чтобы диапазоны id, которые генерирует последовательность и которые вставляются непосредственно в запросе не пересекались? например задать очень большое начальное значение для последовательности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:00 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
Ну то что так желать запрещено по всем канонам - тебя 2-я Нормальная Форма выучит, а если нет, то это хорошо. На спецов будет больше спрос. То, что вы хотите сделать обычно делается через луп по id и взятие 1-го пустого номера. То что при этом у вас будут дикие проблемы с транзакциями и придется лочить таблицу - так-же понимаете? Если да, но все-таки хочется - можно через цикл, а можно при делите заносит id'ы в отдельную таблицу и лочить ее. Соответственно делать или лок этой таблицы, выбор оттуда значения, анлок таблицы, а если таблица уже залочена, то nextval. Но еще раз повторюсь: Если вы так сделаете с первичным ключом (может у вас там еще для чего-то это надо), то ночью придет злой дух СУБД и анально вас покарает =))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:09 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:11 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
Alexius, Да, конечно так можно сделать, и я прекрасно понимаю что 9223372036854775807 и проверку делать на переполнение можно не делать, это очень много и даже если вставлять каждую секунду то этого ватит на: 9223372036854775807сек= 153722867280912930.1167мин= 2562047788015215.50194часов= 106751991167300.65суток= 292471208677.54 лет =-O но есть закон подлости же, вдруг кто-то введёт значение table.id со значением 10^5 , и через полгода произойдёт так что в один ответственный момент что-то не попадёт в табличку :). Впринциме моя реализация "работает", так что вопрос скорей всего академический, но решить очень хочется :-[ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:18 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV но есть закон подлости же, вдруг кто-то введёт значение table.id со значением 10^5 , и через полгода произойдёт так что в один ответственный момент что-то не попадёт в табличку :) ну и чем принципиально будет тогда отличаться твой exception от pk violation? результат один и тот же. ALEXSAV Впринциме моя реализация "работает", так что вопрос скорей всего академический без обоснования "зачем все это нужно" проблема высосана из пальца. придумали себе трудности и теперь их героически решаем. если в конечном итоге "половина" id все равно будет не теми, что хотели, то какой смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:37 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV, Можно после вставки с заданным id делать Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:39 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
WarstoneНу то что так желать запрещено по всем канонам - тебя 2-я Нормальная Форма выучит, а если нет, то это хорошо. На спецов будет больше спрос. ... это не относится к вопросу,вообще id-сурогат,а их плюсы и минусы обсуждались! WarstoneТо, что вы хотите сделать обычно делается через луп по id и взятие 1-го пустого номера. То что при этом у вас будут дикие проблемы с транзакциями и придется лочить таблицу - так-же понимаете? Если да, но все-таки хочется - можно через цикл, а можно при делите заносит id'ы в отдельную таблицу и лочить ее. Соответственно делать или лок этой таблицы, выбор оттуда значения, анлок таблицы, а если таблица уже залочена, то nextval. тут вы меня видимо неправильно поняли, я допускаю пробелы в последовательности... LeXa NalBatпри этих вставках генерите id из последовательности (которую создайте явно) Неплохо,спасибо :), я так тоже пробовал - так неполучается в правилах использовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:42 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAVно есть закон подлости же, вдруг кто-то введёт значение table.id со значением 10^5 , и через полгода произойдёт так что в один ответственный момент что-то не попадёт в табличку :). Впринциме моя реализация "работает", так что вопрос скорей всего академический, но решить очень хочется :-[Если у вас id - идентификатор записи, то вы не должны давать его править конечному пользователю. Это аксиома построения БД. Примите это на веру, если не понимаете - почему. Если-же id - это пользовательское что-то и не является PK, то nextval - это просто "подсказка" или "помощь ленивому". Ну а тогда все просто max(id)+1 после insert'а или update'а вас спасут, наверно. Ну а то что вы написали в процитированном мной абзаце - бред полнейший. Так как если пользователь введет 2^64-1, то 2^64 вызову переполнение разрядной сетки и у вас транзакция откатится. Вот чтоб такого не было id'ы заводят автоматом, а не "как вы" (в том числе). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:46 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV... это не относится к вопросу,вообще id-сурогат,а их плюсы и минусы обсуждались!Отлично, но он не должен быть изменяемым пользователем. Суррогат - на здоровье. Никто не мешает. Это удобно зачастую, а вот user-input в суррогатный ключ = профнепригодности программиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:47 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
chpashaну и чем принципиально будет тогда отличаться твой exception от pk violation? результат один и тот же. мой экцепшн произойдёт только когда все из 9223372036854775807 будут использованы в id, его можно будет интерпретировать как ошибку и т.д :) chpashaбез обоснования "зачем все это нужно" проблема высосана из пальца. придумали себе трудности и теперь их героически решаем. если в конечном итоге "половина" id все равно будет не теми, что хотели, то какой смысл? Может и из пальца и без смысла... надо мне, вот и обоснование! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 15:54 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
WarstoneОтлично, но он не должен быть изменяемым пользователем. Суррогат - на здоровье. Никто не мешает. Это удобно зачастую, а вот user-input в суррогатный ключ = профнепригодности программиста. Вы собираетесь критиковать меня и вопрос?! Я спросил то что мне нужно и как мне нужно, если нет предложений по реализации, то спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 16:04 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAVLeXa NalBatпри этих вставках генерите id из последовательности (которую создайте явно)Неплохо,спасибо :), я так тоже пробовал - так неполучается в правилах использоватьпоясните, что именно не получается? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 16:16 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAVМожет и из пальца и без смысла... надо мне, вот и обоснование! это не обоснование, а детский сад ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 17:27 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
chpashaALEXSAVМожет и из пальца и без смысла... надо мне, вот и обоснование! это не обоснование, а детский сад Вы собираетесь критиковать меня и вопрос?! Я спросил то что мне нужно и как мне нужно, если нет предложений по реализации, то спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 18:55 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAVchpashaну и чем принципиально будет тогда отличаться твой exception от pk violation? результат один и тот же. мой экцепшн произойдёт только когда все из 9223372036854775807 будут использованы в id, его можно будет интерпретировать как ошибку и т.д :) chpashaбез обоснования "зачем все это нужно" проблема высосана из пальца. придумали себе трудности и теперь их героически решаем. если в конечном итоге "половина" id все равно будет не теми, что хотели, то какой смысл? Может и из пальца и без смысла... надо мне, вот и обоснование! Я бы всетаки бы повесил before insert trigger который бы всегда бы проставлял для id - nextval(...) если даже id есть в insert запросе. Т.е. вставлять можно и с id но реально вставленный id будет другой :). Альтернатива опять же before insert триггер который будет проверять что nextval() значение не занято... и если занято вызывать его в цикле пока не будет найдено свободное значение. Проблема вашего подхода в том что если кто то введет id=2^63 то циклом идти до него делая nextval на каждом шагу займет вечность :). Проблема N2 в том что если разрешать вводить id руками могут попробовать ввести уже занятый id и что при этом делать совершенно не ясно. PS: бросайте в rules играться... триггера и хранимки 99% проблем (кроме updateable view) решают изящнее, быстрее,сильно менее глючно и главное понятным образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 19:09 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV Вы собираетесь критиковать меня и вопрос?! и ты и вопрос не выдерживают никакой критики. так что не стану. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 19:34 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
chpasha, извините, но если не хотите и не знаете ответа (написать запрос), то не надо хамить, просто пропустите эту тему, не надо тро́ллинга.Я намеренно абстрагировал и выделил от других сущностей вопрос, чтобы пользователям форума не пришлось копаться в реализации системы.Мне нужен один запрос на pgSQL!!!!! Maxim Boguk, Спасибо за советы, я уже тоже склоняюсь уже к вашему мнению :), если не придумаю, то так и оставлю с тригерами и хранимыми процедурами. Пока есть время - почитаю мануалы по теме WITH RECURSIVE, если разберусь сам - так напишу результат :). p.s. ...зае , уже не первый раз спрашиваю что-то на форуме и 80% ответов это тупо троллинг о неправильных вопросах и плохих програмистах... Господа, будте вежливей!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 20:16 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAVЯ намеренно абстрагировал и выделил от других сущностей вопрос, чтобы пользователям форума не пришлось копаться в реализации системы ты не первый и не последний, кто думает, что знает, что ему надо. причем всем тебе подобным характерна одна и та же линия поведения - вы становитесь в позу. ALEXSAV...зае не бегай голым (с) ALEXSAV , уже не первый раз спрашиваю что-то на форуме и 80% ответов это тупо троллинг о неправильных вопросах и плохих програмистах если тебе двое говорят, что ты пьян - иди спать ALEXSAV Господа, будте вежливей!!!!! товарищ, будь попроще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 21:00 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV, И всё-таки, что вас удерживает от стандартного решения? (запрет задания идентификатора руками и DEFAULT NEXTVAL('myseq') автоматом на поле) Если вам нужен ручной номер - почему не хотите завести отдельное неключевое поле,для отображения? Одно дело - приказ свыше о поле с неразрывной нумерации, другое как здесь. Человек, конечно, взрослый, можете не обращать внимание на то, что так как вы - никто не делает, и что это потенциальная проблема. Сами себе злобный буратино. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2010, 23:29 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
Сделал следующий запрос, Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2010, 08:41 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
ALEXSAV, Спасибо тебе добрый человек, за интересное решение! А по поводу умников, которые начинают выступать, зачем это нужно, скажу так кто как хочет, так и делает...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 09:39 |
|
||
|
получение свободного идентификатора из sequence
|
|||
|---|---|---|---|
|
#18+
SJenek, а вы сами это решение пробовали? я сам конечно его не пробовал, но мне лично, кажется что WITH... блок тут лишний, и только зря сиквенс прокручивается каждый раз (полностью?). вполне можно было использовать generate_series(1, 9223372036854775806, 1) не производя новых дырок в ид при конкурентой вставке (то что сиквенс работает вне транзакции вам наверное известно?). имхо конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 10:05 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=36773050&tid=1997284]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
150ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 452ms |

| 0 / 0 |
