- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下查询:
$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
获取它,以防人们同时创建发票。
最佳答案
问题是带有参数的 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/
代码如下: $the_question = $_POST['question']; $the_answer = $_POST['answer']; $d
我不知道,我的代码有什么问题。我尝试获取最新的插入 ID,它正在回显 0。有什么想法吗? public function __construct() { $this->mysqli = new m
终于开始学习准备好的语句了。尝试运行一对简单的插入时,我遇到了一个令人抓狂的错误: $p_stmt = $mysqli->prepare("INSERT INTO ww_pages (page_key
我正在将一个旧项目从 php 5.3 编辑到 php 7+。不愉快的工作,但我必须对代码进行最少的更改。 我遇到了以下问题。insert_id 始终返回 0。 我读到这可能是因为我的表上没有 auto
我刚遇到需要复制唯一性的情况另一列中每个新行的(自动递增)ID。所以我是想知道,而不是用老式的方式来做: 插入行 获取insert_id 用 insert_id 更新行 我可以告诉 MySQL 使用与
我正在尝试使用 $mysqli->insert_id 重命名一个文件,以便我的程序可以创建多个文件。相反,它只是创建一个 id 为 0 的文件,并且每次覆盖该文件而不是创建一个新文件。我想知道我是否需
我正在尝试获取最后插入的 id MySQL,但它没有返回任何内容。行被插入到数据库中并且 $wpdb->last_query 也给出了最后插入的查询。这是我的代码 global $wpdb;
美好的一天! 我有一个代码,当我单击“提交”按钮时,我将执行这两个功能并将数据插入具有 auto_increment ID 的数据库中。 public function insert1() {
我在当前项目中使用 core php,为了获取最后的插入 ID,我使用 mysqli::$insert_id 但遇到以下错误。 Fatal error: Access to undeclared st
我有以下代码: autocommit(false); // start transaction $sql = "INSERT INTO my_table (col1, col2) VALUES
谁能看看这个并告诉我为什么它不起作用。这是我正在学习的类(class)的一部分。插入查询工作正常,如果我调用 $char->db->insert_id;从课外它可以工作($char 是类(class)
是否可以获得前两个查询的insert_id?我可以得到最后一张,但想要前两张。在下面的示例中,处理表单后,我想向地址表添加一个新角色,向角色表添加新行,然后使用前两个查询中插入的查询中的 id 添加一
请原谅我的英语,我希望你能理解我的问题... 在我的程序中,当您使用模态+表单向数据库(MySQL)提交新记录时,它会在数据表中绘制,而无需刷新或重新充电实际页面,而是动态附加的。 我需要做的是,在每
我有 2 个表,我想将 bndid 添加到循环中的数组数据中bndid=insert_id $relative_list[$x]['bnddesc'], 'bndprice'
在 postgresql 9.3 中是否有等价于 $mysqli->insert_id 的东西?我正在导入一个表,但我需要将表中创建的最后一个主键用作第二个表中的外键?表1---->表2完成一条记录。
我有以下查询: $year = 2019; $month = 6; $stmt = $db->prepare('INSERT INTO officeRec
我有一个发票表,它为每张发票存储一条记录,id 列 (int AUTO_INCREMENT) 是主键,也是发票引用号。 现在,不幸的是,我不得不手动迁移一些在旧系统上生成的发票,这些发票具有五位数 I
我在 3 到 4 年前开始编程,我记得在 2005 年的一些 php 安全书籍中讲到使用 mysql_insert_id 检索 last_inser_id 的安全性。 书上说,如果同时有多个请求到服务
我正在尝试在新用户注册时从我的“用户”表中获取自动递增 ID,并能够在将用户插入“用户”表后立即将该 ID 用于另一个查询。 我想将“users”表的“id”用于“payment_status”表中的
下面是我的代码: //In one of my model(name is commonmodel) I wrote public function create_and_get($t
我是一名优秀的程序员,十分优秀!