【问题标题】:expected ID returned for mysqli_insert_id() is different than actual为 mysqli_insert_id() 返回的预期 ID 与实际不同
【发布时间】:2013-02-11 06:10:41
【问题描述】:

我无法弄清楚为什么用 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 行,我希望它在下一次执行后回显“当前 payerID 为 3”。但是,执行此代码后,它会回显以下内容: "当前的 payerID 是 21"

几个注意事项:

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

我在整个 stackoverflow 中进行了搜索,但有些答案没有 believe that what I'm finding is possible. 感谢任何慷慨的帮助!

【问题讨论】:

  • 在你的表中检查最后生成的 id 是什么。
  • 在 21 之后,在下一个插入它返回什么?请查看您的数据库表。什么存储在你的数据库中?请告诉。
  • 嗨@YogeshSuthar,感谢您的回答。最后生成的 ID 是“3”。
  • 你为什么期待3?请更新您的问题以显示 SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'my_database_name' AND TABLE_NAME = 'payments_table'; 的输出
  • 嗨@ripa。我的表按常规升序存储 ID。最后存储的 id 是“3”。 mysqli_insert_id($dbc) 返回的值也是递增的,目前是“21”。

标签: php mysql auto-increment


【解决方案1】:

你的期望是错误的。

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

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

【讨论】:

    【解决方案2】:

    mysqli_insert_id 返回 last 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';
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您回答我的问题,user2001117。我相信我明白你的建议。但是,我相信我的最后一个查询显然是一个 INSERT 语句。正如我上面提到的,该函数返回“21”而不是预期的“3”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 2015-08-13
      • 2012-01-25
      相关资源
      最近更新 更多