我是php的新手。所以,如果这看起来像一个愚蠢的问题,请原谅我。
假设我有一个MySQL插入语句insert into table (a,b) values (1,2),(3,4),(5,6)
。 table'table'有一个名为'id'的自动增量字段。
如何检索上面的insert语句创建的所有id?
如果我得到一个使用mysqli的例子,那将会很棒。
答案 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");
你们说什么?