【发布时间】:2017-11-22 16:59:09
【问题描述】:
我有以下疑问:
$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 是index 和autoincrement。
如果表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 获取。
【问题讨论】:
-
我认为 Codeigniter activerecord 不适用于
$db->prepare()语句。也许试试$db->insert(),如果你使用AUTO_INCREMENT,我认为你不需要“ON DUPLICATE”。 -
@VincentDecaux 您好,感谢您的回复。我不使用 Codeigniter。 Auto_INCREMENT 仅用于使
$db->insert_id;或LAST_INSERT_ID()返回该字段,请参阅 (dev.mysql.com/doc/refman/5.7/en/getting-unique-id.html)。我会在问题中写出来。