#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) Ничего страшного, если ключи будут пропущены, поскольку транзакция может быть откатана.