Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите понять логику rownum без явного order by  [new]
Alibek B.
Member

Откуда:
Сообщений: 3310
У меня есть таблица с номерами, из которой мне нужно взять один произвольный свободный номер.
Делаю это я так:
update IDS
set STATUS = 1, CHANGED = sysdate, INFO = :info
where STATUS = 0
and ID > 10000
and ID < 90000
and rownum = 1
returning ID into :id

Запрос обновляет какую-то произвольную строку, задавая в ней STATUS=1. Какой вернется ID — не имеет значения, но может быть любым. Но на деле он получается не любым, а последовательным.
По ID в таблице задан первичный ключ, поэтому обычно эта произвольная строка имеет ID=10001, при повторных вызовах 10002, 10003 и так далее.
Но если вручную убрать выставленные статусы (задать STATUS=0 для всех обновленных строк), то при повторении запроса эти строки не используются и обновляются (и возвращаются ID) строки 10004, 10005 и т.д.
Если бы ID каждый раз были рандомные, либо если бы после обнуления статусов они начали использоваться повторно с 10001, то это было бы логично. Но почему нумерация продолжается, как если бы в таблице был какой-то указатель на строку?
5 ноя 19, 12:08    [22009853]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29402
Alibek B.
and ID > 10000
and ID < 90000
Почитай план, чудак.
5 ноя 19, 12:15    [22009856]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2012
Alibek B.
У меня есть таблица с номерами, из которой мне нужно взять один произвольный свободный номер.
Делаю это я так:
update IDS
set STATUS = 1, CHANGED = sysdate, INFO = :info
where STATUS = 0
and ID > 10000
and ID < 90000
and rownum = 1
returning ID into :id

если бы после обнуления статусов они начали использоваться повторно с 10001, то это было бы логично.



как можно повторно, если Вы явно указываете STATUS = 0 (флажок повторно НЕ выбирать)

.....
stax
5 ноя 19, 12:18    [22009858]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1087
Alibek B.,

предположу row migration.
5 ноя 19, 12:40    [22009870]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
Alibek B.
Member

Откуда:
Сообщений: 3310
Elic
Почитай план, чудак.


UPDATE STATEMENT ALL_ROWSCost: 113 Bytes: 17 Cardinality: 1
3 UPDATE IDS
2 COUNT STOPKEY
1 TABLE ACCESS FULL TABLE IDS Cost: 113 Bytes: 1 360 051 Cardinality: 80 003
На что именно обратить внимание?

Stax
как можно повторно, если Вы явно указываете STATUS = 0 (флажок повторно НЕ выбирать)

Еще я писал «задать STATUS=0 для всех обновленных строк».

проходил мимо...
предположу row migration.

По всей видимости да. А последовательность видимо потому, что записи в таблице тоже создавались последовательно.
5 ноя 19, 22:55    [22010280]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 52744
Alibek B.
Но если вручную убрать выставленные статусы (задать STATUS=0 для всех обновленных строк)
в этой же сессии?
5 ноя 19, 23:23    [22010292]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
Alibek B.
Member

Откуда:
Сообщений: 3310
Хоть в той же, хоть в новой. После commit, разумеется.
6 ноя 19, 00:28    [22010316]     Ответить | Цитировать Сообщить модератору
 Re: Помогите понять логику rownum без явного order by  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29402
Alibek B.
На что именно обратить внимание?
На твой update. Тебе не нужно пытаться постичь интимную логику "у неё внутри с неонкой". Результат update-а не противоречит всему statement-у? - Тогда в чем претензия?
Хочешь чего-то особенного? - Будь добр сперва это заказать.
6 ноя 19, 07:42    [22010359]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить