У меня есть таблица, в которую часто вставляются новые данные. Мне нужно получить самый последний идентификатор таблицы. Как я могу это сделать?
Это похоже на SELECT MAX(id) FROM table
?
У меня есть таблица, в которую часто вставляются новые данные. Мне нужно получить самый последний идентификатор таблицы. Как я могу это сделать?
Это похоже на SELECT MAX(id) FROM table
?
INSERT
и запросом MAX(id)
, вы можете получить идентификатор, который не является вашим последним идентификатором.
Ответы:
Если вы используете PDO, используйте PDO::lastInsertId
.
Если вы используете Mysqli, используйте mysqli::$insert_id
.
Если вы все еще используете Mysql:
Пожалуйста, не используйте
mysql_*
функции в новом коде . Они больше не поддерживаются и официально устарели . Видите красную рамку ? Вместо этогоузнайте о подготовленных операторах и используйте PDO или MySQLi - эта статья поможет вам решить, какие. Если вы выберете PDO, вот хороший учебник .
Но если нужно, используйте 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 :
$pdo->lastInsertId();
С Mysqli :
$mysqli->insert_id;
Пожалуйста, не используйте mysql_*
функции в новом коде . Они больше не поддерживаются и официально устарели . Видите красную рамку ? Вместо этогоузнайте о подготовленных операторах и используйте PDO или MySQLi - эта статья поможет вам решить, какие. Если вы выберете 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, то есть в том же сеансе сценария. Если вы его используете, иначе он не будет работать правильно.
ПРИМЕЧАНИЕ: если вы выполняете несколько вставок с одним оператором, 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)
Это возвращает последний вставленный идентификатор текущего соединения, поэтому, если вы правильно управляете своими соединениями, это должно работать. По крайней мере, у меня сработало.