如何获取由一个多行插入语句创建的行的所有ID

时间:2010-05-28 12:02:37

标签: php mysql insert mysqli

我是php的新手。所以,如果这看起来像一个愚蠢的问题,请原谅我。

假设我有一个MySQL插入语句insert into table (a,b) values (1,2),(3,4),(5,6)。 table'table'有一个名为'id'的自动增量字段。

如何检索上面的insert语句创建的所有id?

如果我得到一个使用mysqli的例子,那将会很棒。

5 个答案:

答案 0 :(得分:1)

你做不到。我建议您维护自己的ID(使用guid或自己的自动增量表)并在插入表时使用它。

但是可以使用LAST_INSERT_ID()获取最后插入的自动增量值:

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

答案 1 :(得分:1)

AngeDeLaMort的答案几乎是正确的。当然,处理该问题的最合适的方法是一次插入一行并轮询insert_id或在其他地方生成序列(在可伸缩性方面具有额外的好处)。

我建议强烈反对尝试确定最后一个insert_id并将其与插入后的最新insert_id 进行比较 - 这也可能会失败。

但......另一种方法是:

....
"INSERT INTO destn (id, data, other, trans_ref) 
 SELECT id, data, other, connection_id() FROM source";
....
"SELECT id FROM destn WHERE trans_ref=connection_id()";
....
"UPDATE destn SET trans_ref=NULL where trans_ref=connection_id()";

第二个查询将返回生成的ID(请注意,这假定您对所有3个查询使用相同的连接)。第三个查询是必要的,因为连接ID会在断开连接时重新进入池中(即重用)。

下进行。

答案 2 :(得分:1)

在某些情况下,如果您有另一个排序标识符(如UserID),则可以通过UniqueID大于或等于mysql_insert_id()来过滤查询,限制受影响的行数并仅显示用户的行。这实际上只适用于交易。

$SQL = "INSERT INTO Table
       (UserID, Data)
       VALUES
       (1,'Foo'),
       (1,'Bar'),
       (1,'FooBar')";

$Result = mysql_query($SQL);
$LastID = mysql_insert_id();
$RowsAffected = mysql_affected_rows();

$IDSQL = "SELECT RecordID
          FROM Table
          WHERE UserID = 1
          AND RecordID >= '$LastID' 
          LIMIT '$RowsAffected'";
$IDResult = mysql_query($IDSQL);

答案 3 :(得分:0)

作为AngeDeLaMort的后续行动: 您可以单独插入并执行以下操作:

$data = array (
    array(1,2),
    array(3,4),
    array(5,6)
);
$ids = array();

foreach ($data as $item) {
   $sql = 'insert into table (a,b) values ('.$item[0].','.$item[1].')';
   mysql_query ($sql);
   $id[] = mysql_insert_id();
}

现在你所有的新id都在$ id数组中。

答案 4 :(得分:0)

也许我可以做到这一点

$insert = "insert into table (a,b) values (1,2),(3,4),(5,6)";
$mysqli->query($insert);
$rows_to_be_inserted=3;
$inserted_id = $mysqli->insert_id // gives me the id of the first row in my list
$last_row_id = ($inserted_id+$rows_to_be_inserted)-1;
$mysql->query("select * from table where id between  $inserted_id and $last_row_id");

你们说什么?