我有一个经常插入新数据的表。我需要获取表的最后一个ID。我怎样才能做到这一点?
类似于SELECT MAX(id) FROM table
吗?
INSERT
和查询之间的表中插入了某些内容MAX(id)
,则您可能会得到一个不是您的最后一个ID的ID。
我有一个经常插入新数据的表。我需要获取表的最后一个ID。我怎样才能做到这一点?
类似于SELECT MAX(id) FROM table
吗?
INSERT
和查询之间的表中插入了某些内容MAX(id)
,则您可能会得到一个不是您的最后一个ID的ID。
Answers:
如果您使用的是PDO,请使用PDO::lastInsertId
。
如果您使用的是Mysqli,请使用mysqli::$insert_id
。
如果您仍在使用Mysql:
请不要
mysql_*
在新代码中使用函数。它们已不再维护,已正式弃用。看到红色框了吗?了解准备的语句来代替,并使用 PDO或库MySQLi -本文将帮助你决定哪些。如果您选择PDO,这是一个很好的教程。
但是,如果需要,请使用mysql_insert_id
。
mysql_insert_id
之后你的mysql_query
。当然,如果您在两者之间的同一连接上执行其他几个查询,那没有什么可以帮助您的。
PDO
我们到处都看到这种偏见是什么?让我们再次看一下功能比较。很明显,mysqli
当您需要用低水平的东西弄脏手时,这就是赢家。换句话说,即使选择PDO,他最终仍将需要使用mysqli
。
有一个函数可以知道当前连接中插入的最后一个ID是什么
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
加上使用max是个坏主意,因为如果在两个不同的会话中同时使用您的代码,可能会导致问题。
该函数称为mysql_insert_id
id
假设它们是独特的并且自动递增的,那么您所写的内容将为您带来最大的收益,假设您可以处理并发问题,那么这很好。
由于您使用MySQL作为数据库,因此有一个特定功能LAST_INSERT_ID()
仅在执行插入操作的当前连接上有效。
PHP为此提供了一个特定的功能mysql_insert_id
。
您可以通过内置的php函数获取最新插入的ID mysql_insert_id();
$id = mysql_insert_id();
您还可以通过获得最新的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 id。
php mysql_insert_id()和mysql last_insert_id()仅给出最后的事务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();
?>
通过所有这些讨论,我假设检查最大ID的原因是要知道下一个ID是什么(如果我的最大ID是5,则下一个将是5 + 1 = 6)。
>>如果不是这个原因,我最好的歉意
如果其他人在您的CHECK和INSERT之间插入信息会给您错误的ID。
因此,可以解决是否创建包含时间戳或其他唯一值的哈希。
然后,在同一函数中,您可以使用空值和哈希值插入信息。如果您选择了AUTO_INCRECEMENT,则将创建ID。
然后,在相同的函数中,您仍将具有哈希,并且可以使用相同的哈希查找id。然后,您可以使用mysql UPDATE完成填充空值。
这包括更多的连接,但这仍然是一种方法。
祝你好运解决它。
如果您的表具有AUTO INCREMENT列(如UserID,Emp_ID等),则可以使用此查询获取最后插入的记录 SELECT * FROM table_name,其中UserID =(从table_name选择MAX(UserID)) 在PHP代码中:
$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}
$sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
$result = mysqli_query($con, $sql);
然后,您可以使用提取的数据作为需求
mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", ***mysql_insert_id()***);