gpt4 book ai didi

php - LAST_INSERT_ID() 不等于 $db->insert_id?

转载 作者:行者123 更新时间:2023-11-29 05:58:10 26 4
gpt4 key购买 nike

我有以下查询:

$year         = 2019;
$month = 6;
$stmt = $db->prepare('INSERT INTO officeRechNr (jahr,monat,zahl) VALUES (?,?,1) ON DUPLICATE KEY UPDATE zahl = LAST_INSERT_ID(zahl+1)');
$stmt->bind_param('ii', $year, $month);
$stmt->execute();
echo $db->insert_id;

echo '|';

$sql = 'SELECT LAST_INSERT_ID() as number';
$result = $db->query($sql);
$row = $result->fetch_assoc();
echo $row['number'];
echo '<br>';

officeRechNr 具有唯一的主索引 ['jahr','monat']zahl 是一个 indexautoincrement

如果表officeRechNr是空的,我执行代码3次,那么输出是

1|0

2|2

3|3 ...

为什么 LAST_INSERT_ID() 在插入后为零,但在升级后正确?我需要如何更改我的查询,以便两个函数在插入后输出相同的数字 (1)?


编辑:代码的目的是我需要为在特定年份和月份创建的每张发票提供第三个唯一的升序编号。例如,如果我们在 2015 年和 5 月 (3) 有 7 张发票,那么我会有以下数字

2015-3-1
2015-3-2
2015-3-3
2015-3-4
2015-3-5
2015-3-6
2015-3-7

因此,在数据库的行中,我存储了当前的发票编号,使用上面提供的 SQL 命令,我可以获得下一个编号。列 zahl 是一个 autoincrement 字段的唯一原因是该数字由 insert_id 返回(参见 https://dev.mysql.com/doc/refman/5.7/en/getting-unique-id.html )。还需要通过 insert_id 获取它,以防人们同时创建发票。

最佳答案

问题是带有参数的 LAST_INSERT_ID(...); 不返回生成的 ID,而是在 LAST_INSERT_ID()< 的“内存”中设置给定值 并返回它。因此,在您的第一次执行中没有生成自动递增的 ID(您自己提供了值)并且 LAST_INSERT_ID() 返回 0。在接下来的执行中,您将值 next+1 保存在 LAST_INSERT_ID() 的内部存储中,它会返回该值。此行为在 12.14 Information Functions 中的 MySQL 中进行了描述。 :

If expr is given as an argument to LAST_INSERT_ID(), the value of the argument is returned by the function and is remembered as the next value to be returned by LAST_INSERT_ID().

事实上,您可以跳过 LAST_INSERT_ID() 调用并在没有它的情况下工作。

INSERT INTO
officeRechNr (jahr,monat,zahl)
VALUES
(?,?,1)
ON DUPLICATE KEY UPDATE zahl = zahl+1

这将插入行(具有给定值)或增加计数器。

如果您想要给定年份和月份的当前计数器,您可以运行一个简单的 SELECT 语句。请记住,您可能需要事务或锁,因为在您使用 SELECT 语句获取计数器之前,不同的客户端可能会增加计数器。

关于php - LAST_INSERT_ID() 不等于 $db->insert_id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47440180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com