为mysqli_insert_ID()返回的预期ID与实际ID不同


expected ID returned for mysqli_insert_id() is different than actual

我不明白为什么mysqli_insert_id()返回的id与我预期的id不同。这是我的代码:

$query = "INSERT INTO payments_table (payment_type, payment_number, payment_cost, insertion_date) VALUES ( '$paymentType', '$paymentNumber', '$totalCost', NOW())";
$data = mysqli_query($dbc, $query);
$currentPayerID = mysqli_insert_id($dbc);
//DEBUG
echo 'current payerID is: ' . $currentPayerID;

由于当前有2行,我希望它在下一次执行后回复"currentpayerID为3"。但是,在执行此代码后,它会返回以下内容:"当前付款人ID为21"

注意事项:

  1. 这个"payments_table"表有一个名为"payer_id"的列,它是主键,并具有AUTO_INCREMENT属性
  2. 我已经"截断"了这个表(我相信这和清空它是一样的)

我搜索了整个stackoverflow,但有些答案不相信我的发现是可能的。我感谢任何慷慨的帮助!

您所期望的是错误的。

使用自动递增的字段可以插入数据,并通过每次插入将其递增一来生成唯一的主键。

这对您意味着,返回给您的是一个唯一创建的UD,而不是表中插入的行数。

mysqli_insert_id返回最后一个AUTO_INCREMENT值-如果在payments_table之后但在调用mysqli_insert_id之前插入另一个表,则可能会得到意外值。

此外,AUTO_INCREMENT列与数据库表中的行数不对应,而是与表生命周期内的总行数相对应。更确切地说,MySQL维护一个计数器变量,该变量在每次创建新行时递增。

以下查询将显示表的下一个预期AUTO_INCREMENT值:

SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database_name' AND TABLE_NAME = 'my_table_name';

mysqli_insert_id函数返回查询生成的ID,该查询包含具有AUTO_INCREMENT属性的列。如果上一个查询不是INSERTUPDATE语句,或者修改后的表没有具有AUTO_INCREMENT属性的列,则此函数将返回零。

这可能是你截断了最后一个id是20,然后它给了你21。现在再试一次。