Создаю свой собственный увеличивающийся идентификатор mysql без автоматического увеличения

#mysql #increment

#mysql #увеличиваю

Вопрос:

Как я могу дублировать функцию автоматически увеличивающегося поля идентификатора, не делая само поле автоматически увеличивающимся? Я полагаю, что в моем операторе INSERT мне нужно было бы каким-то образом захватить последний созданный идентификатор и добавить 1 к новой записи. Но я не знаю как. Приветствуется любая помощь.

РЕДАКТИРОВАТЬ: в итоге я последовал совету ypercube и сохранил поле id как автоматически добавляемое и сделал мою строку поиска уникальной. Спасибо!

Комментарии:

1. Неразумно — высокие риски состояния гонки

2. Вы можете использовать trigger . Когда insert выполняется над таблицей, это может set new.id привести к max(of all previous ids) 1 . Но, как советует OMG safely, делайте это только в качестве упражнения, а не на производстве. Риски, связанные с самостоятельным выполнением того, что должна делать база данных.

3. Ну, мне нужно другое поле в качестве моего первичного ключа, и любое автоматически увеличивающееся поле должно быть установлено в качестве ключа, поэтому я не могу автоматически увеличивать свой идентификатор.

4. вы могли бы использовать поле автоинкремента в качестве первичного ключа, а другое ваше поле как unique .

5. @ypercube должен упомянуть требования к транзакции, чтобы избежать условий гонки.

Ответ №1:

Вам нужно будет выбрать самый высокий текущий идентификатор в одном запросе, а затем использовать его при вставке с помощью второго запроса.

Чтобы обойти условия гонки, вы могли бы создать блокировку таблицы (неприятно) или использовать транзакции (лучше, но не идеально)

Комментарии:

1. Это по своей сути очень плохо. Это сработает, только если будут выполнены следующие действия: 1) Транзакция СЕРИАЛИЗУЕМА [что требует, чтобы использовалась транзакция над двумя операторами; автоматическая фиксация отстой] 2) Ничего страшного, если ключи будут пропущены, поскольку транзакция может быть откатана.