powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
14 сообщений из 14, страница 1 из 1
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961376
davidblbulyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит вот так я создаю таблицы:
Код: 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.
CREATE TABLE `private_dialogs`(
  `DID` INT NOT NULL AUTO_INCREMENT,/*идентификатор диалога*/
  `CreateTime` TIMESTAMP,/*дата создания*/
  `CreatorNick` varchar(50) NOT NULL,/*ник создавшего*/
  `DialogProperties` JSON, /*Список подключённых пользователей*/
  PRIMARY KEY(`DID`)
);
CREATE TABLE `invited_keys`(
  `KID` INT NOT NULL AUTO_INCREMENT,
  `InviteKey` varchar(100) NOT NULL UNIQUE,
  `ForDID` INT NOT NULL,
  `CreateTime` TIMESTAMP,
  PRIMARY KEY(`KID`),
  FOREIGN KEY(`ForDID`) REFERENCES `private_dialogs`(`DID`) ON DELETE CASCADE
);
CREATE TABLE `messages`(
  `MID` INT NOT NULL AUTO_INCREMENT, /*идентификатор сообщения*/
  `time` TIMESTAMP,/*время отправки*/
  `nick` varchar(50) NOT NULL,/*ник отправившего*/
  `message` varchar(1000) NOT NULL,/*текст сообщения*/
  `DID` INT DEFAULT NULL,/*ид диалога, если 0, то это общий чат*/
  PRIMARY KEY(`MID`),
  FOREIGN KEY(`DID`) REFERENCES `private_dialogs`(`DID`) ON DELETE CASCADE 
);


Потом вставляю в таблицу `messages` (не вставляя ничего в таблицу `private_dialogs`:
Код: sql
1.
2.
3.
4.
5.
INSERT INTO `messages` (`nick`, `message`, `DID`) VALUES('dadwa','dwadwad', NULL);
/*можно ещё раз*/
INSERT INTO `messages` (`nick`, `message`, `DID`) VALUES('dadwa','dwadwad', NULL);
/*А теперь, выполняю запрос который выдаёт ошибку(специально)*/
INSERT INTO `messages` (`nick`, `message`, `DID`) VALUES('dadwa','dwadwad', -313);


И вот, после последнего запроса(который с ошибкой) выполнить:
Код: sql
1.
INSERT INTO `messages` (`nick`, `message`, `DID`) VALUES('dadwa','dwadwad', NULL);


То пропускается автоинкрементное значение, ну т.е. если предыдущая успешно вставленная запись была с идентификатором 4, то запись вставленная успешным запросом после неуспешного будет иметь идентификатор 6. А записи с идентификатором 5 не будет.
И как это понимать? Баг или я неправильно вставляю записи? Или же ошибка в структуре таблиц?
Версия MySQL: 5.7.30-0ubuntu0.18.04.1-log
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961384
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что покажет
Код: sql
1.
SHOW VARIABLES LIKE "%auto_increment%"

и версия сервера какая
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961397
davidblbulyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,
mysql> SHOW VARIABLES LIKE "%auto_increment%";
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in set (0.01 sec)

mysql>
Но это до выполнения неудачного запроса, уже после того как был выполнен удачный. После выполнения неудачного запроса вывод точно такой же, перед выполнением SHOW VARIABLES я переключился на мою базу данных. А версию сервера как узнать?
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961398
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
davidblbulyan,

Это не баг, это штатное поведение MySQL.
Значения для автоинкремента генерятся даже в том случае, если INSERT падает с ошибкой, но не используются.

Частично описано тут - https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961415
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так то да, я подумал что после 2-х успешных 3-й неуспешный и автоинкр сразу = 6
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961417
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
davidblbulyan,
А версию сервера как узнать?
Код: sql
1.
select version();

вы указали я пропустил - 5.7.30
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961418
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автоинкремент гарантирует что:

1) Однажды сгенерированное значение больше не будет сгенерировано.

2) Значение, сгенерированное позже, всегда больше значения, сгенерированного раньше.

Всё. Больше ничего не гарантируется. В том числе и непрерывность генерируемых значений.
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961445
davidblbulyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Да, в документации такое действительно описано, но зачем оно нужно? Или же почему оно так?
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961461
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда вставка записи не проходит. Из-за ошибки запрос не выполняется - но значение было выделено. Из-за дублирования выполнение свернёт на ON DUPLICATE KEY UPDATE - но значение было выделено. А однажды сгенерированное значение больше не генерируется - даже если оно заведомо не было использовано по назначению.
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961464
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
davidblbulyan,

автоинкремент должен быть уникальным и это все, что от него требуется в таблице.
ну а так - просто алгоритм такой при инсерте
взяли номерок в очереди и работаем с ним. Ничего не блокируем
кто то в это время может взять следующий, тоже не блокирует.
У нас ничего не получилось - куда мы вернем номерок?
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961469
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
У нас ничего не получилось - куда мы вернем номерок?

- Я скачал файл, но он мне не нужен - как закачать его обратно?
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961470
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

выкинуть, как и номерок
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961475
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
davidblbulyan
Или же почему оно так?
Не знаю. Подозреваю, что ответ можно найти только в исходниках.
...
Рейтинг: 0 / 0
Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
    #39961890
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там же любимaя запись Си
Пре-инкремент Inc++
Переменная в памяти Взяли переменную для дела прибавили 1, и не задерживаем, другие использовать могут
а иначе бардак с переменной AutoInc
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Кажется я нашёл баг в MySQL или я что-то не так делаю? Пропуск автоинкрементного значения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]