PHP/MySQL 插入后获取自增值

22
在我的 MySQL 表格中,我有一个 ID 列,它被设置为自动增量。然后我执行这样的查询:
INSERT INTO table (id, foo) VALUES ('', 'bar')
如何安全地找出是哪个 ID 被插入了?
如果我只查询最后一个 ID,这可能不安全,因为在此期间可能发生了另一个插入操作,对吧?

2
错误。LAST ID将是使用该连接插入的最后一个ID。除非您共享连接,否则它将是刚刚发生的语句。因此,“INSERT INTO; SELECT LAST_INSERT_ID”将是正确的。 - Konerak
2
可能是php/MySQL插入行然后获取'id'的重复问题。 - hakre
是的,抱歉,这是另一个问题的重复。 - clamp
11个回答

16

3
值得注意的是,PHP方法正在被弃用,因此从现在开始使用MySQL方法会更明智。 - RCNeil
@RCNeil 嘿,伙计们,假设你的网站有多个并发访问者,如果两个不同用户几乎同时执行了 inserts 操作,那么使用 mysqli_insert_id() 会遇到问题吗? - oldboy
如果查询成功执行,mysqli_insert_id() 函数将返回从该特定查询生成的 ID,因此您可以将其分配给一个变量,并在此之后继续进行某些操作。它不是提取“表中放置的最后一个 ID”,而是提取刚刚使用该特定查询在该特定连接中生成的 ID。- https://stackoverflow.com/a/38957080/884953 - RCNeil

4

1
如果您的网站上有多个并发用户,并且两个“inserts”几乎立即相继执行,那么mysqli_insert_id()会遇到问题吗?是否有一种方法将SELECT LAST_INSERT_ID()INSERT INTO...语句组合起来,然后使用PHP获取值以避免这种情况? - oldboy

3
如果您使用PHP来获取在INSERT语句后返回的自增值,请尝试使用MySQLi insert_id function。旧版本的mysql_insert_id()已被PHP废弃。
以下是一个示例:
 <?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

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

/* drop table */
$mysqli->query("DROP TABLE myCity");

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

2

使用mysql_insert_id()时要小心,特别是如果您有多个与数据库的连接。因为它不会获取您插入的查询的值,而是获取表中最新的id。这可能是另一个查询插入的行。只有在一个连接中访问数据库时才使用此函数。

https://www.php.net/manual/en/function.mysql-insert-id.php


2

1
虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Bill the Lizard

2
如果您使用mysql_query("..."),那么您需要的函数是mysql_insert_id()。如果您使用其他方式进行查询,则应查看相应的文档。

1

1

1
mysqli_insert_id();

您也可以直接运行此查询:

INSERT INTO table (foo) VALUES ('bar')

1

简单方法

插入数据:

$sql = "INSERT INTO table (id, foo) VALUES ('', 'bar')";
$conn->query($sql)

获取 ID:
return $conn->insert_id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接