|
|
|
Холостые инкрементации суррогатного ключа
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! У меня возникла проблема в том, что происходят холостые, нежелательные, необъяснимые (пока) инкрементации суррогатно ключа. Надеюсь на помощь форума. Я использую 10.0.21-MariaDB-log MariaDB Server Есть таблица-список тегов к статьям с суррогатным AUTO_INCREMENT ключом `tag_id` . Код: sql 1. 2. 3. 4. 5. 6. Дальше происходит наполнение этой таблицы тегами из свежедобавленной статьи: Код: sql 1. 2. 3. 4. Видно, что третий запрос не выполнится из-за требования уникальности поля `name` . Посмотрим на значение счетчика автоинкремента: Код: sql 1. Оно равно 5-и. Верно! Так и должно быть 1 + 4 = 5 , потому что БД проверяет ограничения полей и выполняет действия инкрементирования по порядку полей. В третьем запросе сначала произошел инкремент счетчика, потом проверка на уникальность `name` , проверка вернула отрицательный результат -> запрос не выполнился, тем не менее счетчику декрементиться не позволено -> он вырос в холостую (без вставки соответствующего значения). Это еще не моя основная проблема, моя основная проблема ниже, прошу прочитать. Такое поведение ключа объяснимо, но нежелательно ! Хочется не иметь таких пропусков в суррогатном ключе. Поэтому я нашел в интернете совет воспользоваться временной таблицей - http://stackoverflow.com/a/11276648 при заполнении основной таблицы. Внимание, уважаемые, код таков: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Да, значение 'three' специально повторяется. После прошлых INSERT мы оставили значение счетчика равным 5, то после такого финта с временной таблицей хочется увидеть его равным 5 + 2 = 7, но нет! Он будет иметь значение 8. При том, что если бы мы сделали следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. То значение предсказуемо будет 5 + 1 = 6. Как так происходит? Буду благодарен за объяснение поведения и другую схему обхода холостых инкрементаций при дублировании. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 02:46:23 |
|
||
|
Холостые инкрементации суррогатного ключа
|
|||
|---|---|---|---|
|
#18+
vitkorobХочется не иметь таких пропусков в суррогатном ключе.А мне хочется стать императором Земли, да вот беда - схему боевых треног никак не получается разработать... А если серьёзно - зачем вам это? Не бывает так, что просто "хочется", "хочется" всегда почему-то. Если "почему-то"="мне нужна непрерывная последовательность порядковых номеров", то заводите под них отдельное поле и нумеруйте записи уже после их реального появления в таблице. PS. Кстати, в той же статье автор честно предупреждает, что "I haven't tested this for performance". PPS.vitkorobПосле прошлых INSERT мы оставили значение счетчика равным 5, то после такого финта с временной таблицей хочется увидеть его равным 5 + 2 = 7, но нет! Он будет иметь значение 8.Ну я хз, что у вас происходит, у меня получилось 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 06:53:29 |
|
||
|
Холостые инкрементации суррогатного ключа
|
|||
|---|---|---|---|
|
#18+
vitkorob, это ожидаемое поведение, задокументированное и полезное, как ни странно. не обращай внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2015, 11:50:17 |
|
||
|
Холостые инкрементации суррогатного ключа
|
|||
|---|---|---|---|
|
#18+
tanglirНу я хз, что у вас происходит, у меня получилось 7. На какой версии проверяли? Я сейчас протестировал еще и на версии _5.5.44-0+deb8u1_, которая поставляется с Debian 8, там инкрементация происходит тоже до 8. MasterZivэто ожидаемое поведение, задокументированное и полезное, как ни странно. MasterZiv, расскажите, пожалуйста, подробнее алгоритм поведения БД. Просто я пока не понимаю как ожидать ( = предсказать ) такой результат. Я не смог найти место в документации, где о таком поведении говорится. Будьте добры, укажите место в документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2015, 00:41:07 |
|
||
|
Холостые инкрементации суррогатного ключа
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2015, 09:58:31 |
|
||
|
Холостые инкрементации суррогатного ключа
|
|||
|---|---|---|---|
|
#18+
Просто я пока не понимаю как ожидать ( = предсказать ) такой результат. ожидать -всегда. предсказать невозможно. просто нужно не закладываться на то, что сгенерированные значения строго последовательны. строго говоря, даже без этого "дефекта" автоинкремента на это надеяться нельзя - есть другие сессии, они могут вклиниться в твою последовательность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2015, 10:03:19 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=122&tid=1832604]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 384ms |

| 0 / 0 |
