我不明白为什么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"
注意事项:
- 这个"payments_table"表有一个名为"payer_id"的列,它是主键,并具有AUTO_INCREMENT属性
- 我已经"截断"了这个表(我相信这和清空它是一样的)
我搜索了整个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
属性的列。如果上一个查询不是INSERT
或UPDATE
语句,或者修改后的表没有具有AUTO_INCREMENT
属性的列,则此函数将返回零。
这可能是你截断了最后一个id是20,然后它给了你21。现在再试一次。