@bioforge
Верстающий пыхер

Как лучше хранить и добавлять порядковый номер в таблице?

Добрый день!

Столкнулся с проблемой, что при большом кол-во потоков в базе начинают появлятся дубли для порядкового номера документа.

Работает так, что перед записью в таблицу инкрементируется последний порядковый номер:
SELECT ui_id+1 FROM deals WHERE user_id = 1 ORDER BY ui_id DESC LIMIT 1;

и передаётся в новую запись
INSERT INTO `deals` (`id`, `ui_id`, `user_id`) VALUES (NULL, "5", "1")


Как лучше избежать такой проблемы ?
  • Вопрос задан
  • 48 просмотров
Пригласить эксперта
Ответы на вопрос 4
xzdshr
@xzdshr
В нормальных СУБД есть понятие последовательности/sequence, которое всегда выделяет уникальный порядковый номер.
MySQL в данный момент это не поддерживает, поэтому подобную задачу решают через LOCK.
Ответ написан
Vovanys
@Vovanys
А зачем вообще использовать ui_id если id уже должен быть уникальным ID с автоинкрементом.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Полностью блокировать таблицу до окончания записи.
LOCK TABLES `deals` FOR WRITE;
...
UNLOCK TABLES;

Никакой другой поток не получит доступа к таблице до её разблокировки.
Ответ написан
@PapaStifflera
Родился, вырос...
Как-то так:
Создаете таблицу для хранения последовательности (лучше с движком MyISAM):
mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);


Инкремент:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);


Получение результата:
mysql> SELECT LAST_INSERT_ID();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
Badoo Development Москва
от 140 000 до 180 000 руб.
Badoo Development Москва
от 180 000 до 250 000 руб.
от 90 000 до 150 000 руб.
18 авг. 2018, в 09:13
13000 руб./за проект
18 авг. 2018, в 01:10
17000 руб./за проект
17 авг. 2018, в 23:00
5500 руб./за проект