当我插入一行时,我的表的'id'字段自动增加。我想插入一行,然后获取ID。

我会像我说的那样做,但是有没有一种方法可以让我不用担心插入行和获取id之间的时间?

我知道我可以在数据库中查询与输入的信息相匹配的行,但是有很大的变化,会有重复,唯一的区别是id。


当前回答

我只想添加一个关于lastInsertId()的小细节;

当一次输入多个行时,它不会返回最后一个Id,而是返回最后一个插入集合的第一个Id。

考虑下面的例子

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

这里发生的事情是,我在my_table中插入两行新行。该表的id是自动递增的。这里,对于同一个用户,我用不同的varNumb添加了两行。

最后的回显值将等于varNumb=1的行id,这意味着不是最后一行的id,而是在最后一个请求中添加的第一行的id。

其他回答

$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);

看到mysqli_insert_id()。

无论你做什么,不要插入,然后做一个“SELECT MAX(id) FROM mytable”。就像你说的,这是一个竞争条件,没有必要。Mysqli_insert_id()已经有了这个功能。


另一种方法是一次运行两个查询,并使用MySQL的LAST_INSERT_ID()方法,其中两个表被一次修改(PHP不需要任何ID),如:

mysqli_query($link, "INSERT INTO my_user_table ...;
  INSERT INTO my_other_table (`user_id`) VALUES (LAST_INSERT_ID())");

注意,每个连接都单独跟踪ID(因此,已经防止了冲突)。

另一个可能的答案是:

当您定义表时,它将具有列和数据。列id可以具有AUTO_INCREMENT属性。

通过这个方法,你不用担心id,它会自动生成。

例如(选自w3schools)

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

希望这对某些人有所帮助。

编辑:这只是定义如何生成自动ID的部分,创建后获取,之前的答案都是正确的。

试着这样做,你就能得到答案:

<?php
$con=mysqli_connect("localhost","root","","new");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')");

// Print auto-generated id
echo "New record has id: " . mysqli_insert_id($con);

mysqli_close($con);
?>

看看下面的链接:

http://www.w3schools.com/php/func_mysqli_insert_id.asp

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

另外请注意,此扩展在PHP 5.5中已弃用,并在PHP 7.0中删除

正如@NaturalBornCamper所说,mysql_insert_id现在已弃用,不应该使用。现在可以选择使用PDO或mysqli。NaturalBornCamper在他的回答中解释了PDO,所以我将展示如何使用MySQLi (MySQL改进)使用mysqli_insert_id来做它。

// First, connect to your database with the usual info...
$db = new mysqli($hostname, $username, $password, $databaseName);
// Let's assume we have a table called 'people' which has a column
// called 'people_id' which is the PK and is auto-incremented...
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')");
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with:
$lastInsertedPeopleId = $db->insert_id;
// OR
$lastInsertedPeopleId = mysqli_insert_id($db);

查看PHP文档以获得更多示例:http://php.net/manual/en/mysqli.insert-id.php

我只想添加一个关于lastInsertId()的小细节;

当一次输入多个行时,它不会返回最后一个Id,而是返回最后一个插入集合的第一个Id。

考虑下面的例子

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

这里发生的事情是,我在my_table中插入两行新行。该表的id是自动递增的。这里,对于同一个用户,我用不同的varNumb添加了两行。

最后的回显值将等于varNumb=1的行id,这意味着不是最后一行的id,而是在最后一个请求中添加的第一行的id。