Как мне получить последний вставленный идентификатор таблицы MySQL в PHP?


93

У меня есть таблица, в которую часто вставляются новые данные. Мне нужно получить самый последний идентификатор таблицы. Как я могу это сделать?

Это похоже на SELECT MAX(id) FROM table?


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

7
@sathish: Основная проблема этого метода - параллелизм .
Christian C. Salvadó

3
Для уточнения: проблема в том, что если кто-то другой вставляет что-то в таблицу между вашим INSERTи запросом MAX(id), вы можете получить идентификатор, который не является вашим последним идентификатором.
deceze

3
@Jocelyn, этот вопрос был задан годом позже, и его просмотрели на тысячи меньше, чем этот вопрос.
Нафтали, он же Нил,

3
@ Нил, ты прав. Другой вопрос следует закрыть как дубликат этого.
Джоселин

Ответы:


134

Если вы используете PDO, используйте PDO::lastInsertId.

Если вы используете Mysqli, используйте mysqli::$insert_id.

Если вы все еще используете Mysql:

Пожалуйста, не используйте mysql_*функции в новом коде . Они больше не поддерживаются и официально устарели . Видите красную рамку ? Вместо этогоузнайте о подготовленных операторах и используйте PDO или MySQLi - эта статья поможет вам решить, какие. Если вы выберете PDO, вот хороший учебник .

Но если нужно, используйте mysql_insert_id.


Проблема с этим в том, что если у вас происходит много вставок (например, ваша база данных также что-то регистрирует), вы можете получить неправильный идентификатор.
Майк

@Mike Нет, если вы используете mysql_insert_id сразу после вашего mysql_query. Если, конечно, вы выполняете несколько других запросов в том же соединении между ними, что ж, ничего, что может вам помочь.
deceze

7
Чтобы гарантировать, что вы НИКОГДА не получите неправильный идентификатор, оберните свой код ТРАНЗАКЦИЕЙ .
Marcelo Assis

28
mysql проверяет, является ли это последним идентификатором ТЕКУЩЕГО СОЕДИНЕНИЯ, поэтому не возникнет проблем, если вы поместите этот оператор сразу после запроса вставки. Не беспокойтесь о других процессах, выполняющих вставки, и не нужно заключать это в транзакцию. В руководстве по mysql говорится: «Сгенерированный идентификатор сохраняется на сервере для каждого соединения. Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT. от этого клиента . Именно по этой причине вы должны не использовать SELECT MAX (ID)
woens

1
@deceze, что с этой PDOпредвзятостью мы везде видим? Давайте еще раз посмотрим на сравнение функций . Понятно, что mysqliэто победитель, когда вам нужно запачкать руки вещами низкого уровня. Другими словами, даже если один выбирает PDO, он в конце концов , нужно будет использовать в mysqliлюбом случае.
Pacerier

52

есть функция, чтобы узнать, какой последний идентификатор был вставлен в текущее соединение

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

плюс использование max - плохая идея, потому что это может привести к проблемам если ваш код будет использоваться одновременно в двух разных сессиях.

Эта функция называется mysql_insert_id


2
mysql _ (...) устарел в версии PHP> = 5.5.
Яго

Ага, я только что вспомнил. :)
Яго


19

С PDO :

$pdo->lastInsertId();

С Mysqli :

$mysqli->insert_id;

Пожалуйста, не используйте mysql_*функции в новом коде . Они больше не поддерживаются и официально устарели . Видите красную рамку ? Вместо этогоузнайте о подготовленных операторах и используйте PDO или MySQLi - эта статья поможет вам решить, какие. Если вы выберете PDO, вот хороший учебник .



8

То, что вы написали, принесло бы вам наибольшее idудовольствие, если бы они были уникальными и автоматически увеличивались, что было бы хорошо, если бы вы не возражали с проблемами параллелизма.
Поскольку вы используете MySQL в качестве базы данных, существует специальная функция, LAST_INSERT_ID()которая работает только с текущим соединением, в котором была выполнена вставка.
PHP также предлагает специальную функцию для этого mysql_insert_id.


6

Попробуйте, это должно работать нормально:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

1
Спасибо, что заметили. Я редактировал код, на самом деле это $ ссылка (переменная держит соединение)
Санду

3

Чтобы получить последний вставленный идентификатор в codeigniter После выполнения запроса вставки просто используйте одну функцию, вызываемую insert_id()в базе данных, она вернет последний вставленный идентификатор

Пример:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

в одну строку

echo $this->db->insert('mytable',$data)->insert_id();

2

Вы можете получить последний вставленный идентификатор с помощью встроенной функции php mysql_insert_id();

$id = mysql_insert_id();

вы также получите последний идентификатор от

$id = last_insert_id();

5
Кроме того, это неправильно, потому что предлагается использовать устаревшую библиотеку. Действительно, удалите это
STT LCU

@STTLCU Какой фрагмент здесь устарел?
TheBlackBenzKid 01

@TheBlackBenzKid оба, потому что они основаны на функциях mysql_ *
STT LCU

@ Рахул $ id = last_insert_id (); не работает, так как может быть устаревшим.
Эша

2

Его можно использовать mysql_insert_id(), но есть одно конкретное замечание об его использовании: вы должны вызывать его после выполнения запроса INSERT, то есть в том же сеансе сценария. Если вы его используете, иначе он не будет работать правильно.


2

Чисто и просто -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

ПРИМЕЧАНИЕ: если вы выполняете несколько вставок с одним оператором, mysqli :: insert_id будет некорректным.

Таблица:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Теперь, если вы это сделаете:

insert into xyz (name) values('one'),('two'),('three');

Mysqli :: insert_id будет 1, а не 3.

Чтобы получить правильное значение, выполните:

mysqli::insert_id + mysqli::affected_rows) - 1

Это был документ, но он немного неясен.


1

Я предпочитаю использовать чистый синтаксис MySQL, чтобы получить последний идентификатор auto_increment нужной мне таблицы.

php mysql_insert_id () и mysql last_insert_id () предоставляют только идентификатор последней транзакции.

Если вам нужен последний auto_incremented ID любой таблицы в вашей схеме (а не только последней транзакции), вы можете использовать этот запрос

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Вот и все.


я сомневаюсь в этом, поскольку этот SQL просто неверен в контексте вопроса .... Также этот метод чувствует себя подверженным возможным условиям гонки, когда два или более клиентов выполняют этот SQL примерно в одно и то же время ... я не уверен как быстро данные этого столбца обновляются после вставки, что вызывает у меня сомнения ... Функции PHP, которые могут получить последний идентификатор, основаны на уровне соединения / сеанса (делает более или менее то же самое, что и MySQL LAST_INSERT_ID () ), что позволяет сохранить состояние гонки
Раймонд

1

Печально не видеть ответов с примером.

Использование Mysqli :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Использование PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

Используя MySQLiтранзакцию, я иногда не мог получить mysqli::$insert_id, потому что она возвращала 0. Особенно, если я использовал хранимые процедуры, которые выполняли INSERTs. Итак, внутри транзакции есть еще один способ:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

Используйте mysqli, поскольку mysql ограничивает

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

-1

Я старался

mysqli_insert_id($dbConnectionObj)

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


1
Это тот же ответ, что и здесь stackoverflow.com/a/41564156/5468463
Vega

При отрицательном подсчете голосов сообщество может удалить этот лишний пост вместо того, чтобы беспокоить модераторов.
mickmackusa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.