想一个名为foo
的表,其中包含id (PRIMARY & AUTO_INCREMENT)
列。我在这个表中插入一行,然后在此时开始挑战。
$db->query("INSERT INTO `foo` (id, row1, ...) VALUES('', '$row1', ...)");
if (!$db->is_error && $db->last_insert_id) {
$id = $db->last_insert_id;
do_really_important_things_with_last_ID($id);
do_another_important_things_with_last_ID($id);
...
do_ ... with_last_ID($id);
do_ ... with_last_ID($id);
}
我在插入查询后立即调用它并在获取last_insert_id
时使用当前的连接链接,但不知道它是如何重要的(?)。
$this->dbh = @mysql_connect(.....);
...
// query function
$this->result = @mysql_query($query, $this->dbh);
...
if (preg_match("/insert/i", $query)) {
$this->last_insert_id = @mysql_insert_id($this->dbh);
}
我是否应该依赖mysql_insert_id
?
答案 0 :(得分:5)
last_insert_id应该是一个函数,它将返回插入的id
function last_insert_id(){
return @mysql_insert_id();
}
if (!$db->is_error && $db->last_insert_id()) {
$id = $db->last_insert_id();
do_really_important_things_with_last_ID($id);
do_another_important_things_with_last_ID($id);
...
do_ ... with_last_ID($id);
do_ ... with_last_ID($id);
}
答案 1 :(得分:4)
请查看http://dev.mysql.com/doc/refman/5.1/en/getting-unique-id.html了解更多信息,它说:
“对于LAST_INSERT_ID(),最近生成的ID保留在 服务器基于每个连接。它不会被另一个人改变 客户。如果您更新另一个AUTO_INCREMENT,它甚至不会更改 具有非魔法值的列(即,非NULL和值的值) 不是0)。使用LAST_INSERT_ID()和AUTO_INCREMENT列 同时来自多个客户端是完全有效的。每个客户 将收到客户端最后一条语句的最后插入ID 执行“。
所以你应该做得很好,你不应该得到奇怪的结果。
答案 2 :(得分:3)
@Anton是对的。想添加以下内容。
在事务中使用时,必须先调用mysql_insert_id() 犯。否则,它将返回不可预测的结果。