да, этот запрос вернет последний идентификатор таблицы. Но одно условие - ID должен быть первичным ключом. Так вы сможете избежать покаяния.
sathish
7
@sathish: Основная проблема этого метода - параллелизм .
Christian C. Salvadó
3
Для уточнения: проблема в том, что если кто-то другой вставляет что-то в таблицу между вашим INSERTи запросом MAX(id), вы можете получить идентификатор, который не является вашим последним идентификатором.
deceze
3
@Jocelyn, этот вопрос был задан годом позже, и его просмотрели на тысячи меньше, чем этот вопрос.
Нафтали, он же Нил,
3
@ Нил, ты прав. Другой вопрос следует закрыть как дубликат этого.
Проблема с этим в том, что если у вас происходит много вставок (например, ваша база данных также что-то регистрирует), вы можете получить неправильный идентификатор.
Майк
@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
есть функция, чтобы узнать, какой последний идентификатор был вставлен в текущее соединение
То, что вы написали, принесло бы вам наибольшее idудовольствие, если бы они были уникальными и автоматически увеличивались, что было бы хорошо, если бы вы не возражали с проблемами параллелизма.
Поскольку вы используете MySQL в качестве базы данных, существует специальная функция, LAST_INSERT_ID()которая работает только с текущим соединением, в котором была выполнена вставка.
PHP также предлагает специальную функцию для этого mysql_insert_id.
Спасибо, что заметили. Я редактировал код, на самом деле это $ ссылка (переменная держит соединение)
Санду
3
Чтобы получить последний вставленный идентификатор в codeigniter После выполнения запроса вставки просто используйте одну функцию, вызываемую insert_id()в базе данных, она вернет последний вставленный идентификатор
Пример:
$this->db->insert('mytable',$data);
echo$this->db->insert_id(); //returns last inserted id
Кроме того, это неправильно, потому что предлагается использовать устаревшую библиотеку. Действительно, удалите это
STT LCU
@STTLCU Какой фрагмент здесь устарел?
TheBlackBenzKid 01
@TheBlackBenzKid оба, потому что они основаны на функциях mysql_ *
STT LCU
@ Рахул $ id = last_insert_id (); не работает, так как может быть устаревшим.
Эша
2
Его можно использовать mysql_insert_id(), но есть одно конкретное замечание об его использовании: вы должны вызывать его после выполнения запроса INSERT, то есть в том же сеансе сценария. Если вы его используете, иначе он не будет работать правильно.
$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
я сомневаюсь в этом, поскольку этот 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
Используя MySQLiтранзакцию, я иногда не мог получить mysqli::$insert_id, потому что она возвращала 0. Особенно, если я использовал хранимые процедуры, которые выполняли INSERTs. Итак, внутри транзакции есть еще один способ:
Это возвращает последний вставленный идентификатор текущего соединения, поэтому, если вы правильно управляете своими соединениями, это должно работать. По крайней мере, у меня сработало.
INSERT
и запросомMAX(id)
, вы можете получить идентификатор, который не является вашим последним идентификатором.Ответы:
Если вы используете PDO, используйте
PDO::lastInsertId
.Если вы используете Mysqli, используйте
mysqli::$insert_id
.Если вы все еще используете Mysql:
Но если нужно, используйте
mysql_insert_id
.источник
mysql_insert_id
сразу после вашегоmysql_query
. Если, конечно, вы выполняете несколько других запросов в том же соединении между ними, что ж, ничего, что может вам помочь.PDO
предвзятостью мы везде видим? Давайте еще раз посмотрим на сравнение функций . Понятно, чтоmysqli
это победитель, когда вам нужно запачкать руки вещами низкого уровня. Другими словами, даже если один выбирает PDO, он в конце концов , нужно будет использовать вmysqli
любом случае.есть функция, чтобы узнать, какой последний идентификатор был вставлен в текущее соединение
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')'); $id = mysql_insert_id();
плюс использование max - плохая идея, потому что это может привести к проблемам если ваш код будет использоваться одновременно в двух разных сессиях.
Эта функция называется mysql_insert_id
источник
Все нормально. Также вы можете использовать LAST_INSERT_ID ()
источник
select max(id)from table
это нормально?С PDO :
С Mysqli :
Пожалуйста, не используйте
mysql_*
функции в новом коде . Они больше не поддерживаются и официально устарели . Видите красную рамку ? Вместо этогоузнайте о подготовленных операторах и используйте PDO или MySQLi - эта статья поможет вам решить, какие. Если вы выберете PDO, вот хороший учебник .источник
PDO
предвзятостью мы ........То, что вы написали, принесло бы вам наибольшее
id
удовольствие, если бы они были уникальными и автоматически увеличивались, что было бы хорошо, если бы вы не возражали с проблемами параллелизма.Поскольку вы используете MySQL в качестве базы данных, существует специальная функция,
LAST_INSERT_ID()
которая работает только с текущим соединением, в котором была выполнена вставка.PHP также предлагает специальную функцию для этого
mysql_insert_id
.источник
Попробуйте, это должно работать нормально:
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); $query = "INSERT blah blah blah..."; $result = mysqli_query($link, $query); echo mysqli_insert_id($link);
источник
Чтобы получить последний вставленный идентификатор в 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();
источник
Вы можете получить последний вставленный идентификатор с помощью встроенной функции php
mysql_insert_id();
$id = mysql_insert_id();
вы также получите последний идентификатор от
$id = last_insert_id();
источник
Его можно использовать
mysql_insert_id()
, но есть одно конкретное замечание об его использовании: вы должны вызывать его после выполнения запроса INSERT, то есть в том же сеансе сценария. Если вы его используете, иначе он не будет работать правильно.источник
Чисто и просто -
$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1"; $result = $mysqli->query($selectquery); $row = $result->fetch_assoc(); echo $row['id'];
источник
ПРИМЕЧАНИЕ: если вы выполняете несколько вставок с одним оператором, 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
Это был документ, но он немного неясен.
источник
Я предпочитаю использовать чистый синтаксис 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';
Вот и все.
источник
Печально не видеть ответов с примером.
Использование 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
источник
Используя
MySQLi
транзакцию, я иногда не мог получитьmysqli::$insert_id
, потому что она возвращала 0. Особенно, если я использовал хранимые процедуры, которые выполнялиINSERT
s. Итак, внутри транзакции есть еще один способ:<?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; } ?>
источник
Используйте 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(); ?>
источник
Я старался
mysqli_insert_id($dbConnectionObj)
Это возвращает последний вставленный идентификатор текущего соединения, поэтому, если вы правильно управляете своими соединениями, это должно работать. По крайней мере, у меня сработало.
источник