2015-01-09 8 views
0

Каков наилучший способ получить последний вставленный идентификатор из определенной таблицы? Я вижу, по крайней мере, четыре различных подхода:Реализация last_insert_id

1. SELECT LAST_INSERT_ID() 
2. mysql_insert_id() 
3. SELECT max(id) FROM table 
4. SELECT id FROM table ORDER BY id DESC LIMIT 1 

Первый подход бьет второй, потому что второй один возвращает 0, если идентификатор имеет тип bigint. Но проблема в том, что я не могу быть уверен, что id, который я получаю, - из таблицы, которую я хочу, потому что LAST_INSERT_ID() возвращает последние id по всей базе данных. Третий и четвертый подходы не так быстр на больших таблицах, но четвертый подход, по-видимому, превзошел третий по скорости. Я хочу знать, как вы, ребята, реализуете эту задачу в реальных проектах.

+0

'потому что LAST_INSERT_ID() возвращает последний id по всей базе данных', но за соединение. – VolkerK

+4

Никогда не используйте # 3 или # 4, потому что они не будут обрабатывать ситуацию с одновременными пользователями .... Проекты в реальном мире никогда не должны использовать эти методы, если они не хотят быть запущенными с ошибками проектами реального мира с поврежденными данными –

+1

3 + 4 являются крайне ненадежными и опасными. # 2 просто вызывает # 1 в любом случае. Итак ... # 1 или # 2, никогда # 3 или # 4 –

ответ

3

Есть несколько проблем, с 3 и 4, такие как

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

1 и 2 близки к тому же. Они оба являются специфическими для подключения, и поэтому они должны обрабатывать одновременных пользователей просто отлично и быть контекстно-зависимыми, чтобы вы получали то, что ожидаете.

Если вы считаете, что mysql_insert_id имеет некоторые недостатки в отношении типа данных, который он поддерживает, вы можете использовать первый вместо него. У него должно быть примерно одинаковое поведение.

Смежные вопросы