mysqli::insert_id 在重复键上返回错误的 ID

发布于 2024-12-04 07:35:29 字数 676 浏览 2 评论 0原文

当在 PHP 中使用 mysqli::insert_id 进行 INSERT INTO ON DUPLICATE KEY UPDATE 时,如果更新了行,我会不断获取下一个自动增量而不是更新的行。在同一个数据库但在另一个表中,使用 ON DUPLICATE KEY UPDATE 时没有这种行为。相反,我获取更新行的 ID。但现在由于某种原因,在我创建的新表中,我不断获得下一个甚至不存在的 id。两个表都是MyISAM,并且有一个自动增量字段。我不明白为什么他们的行为不同。

示例:

==================================
Table: example
==================================
id  |   unique_field    |   data
==================================
1   |   unique1         |   123
2   |   unique2         |   456

INSERT INTO
    example
SET
    unique_field = 'unique1',
    data = '321'
ON DUPLICATE KEY UPDATE
    data = '321'


// mysqli::insert_id returns 3 (not 1)!!

有什么想法吗?

When using mysqli::insert_id in PHP for INSERT INTO ON DUPLICATE KEY UPDATE, I keep getting the next auto increment rather than the updated row if the row is updated. In the same database but in another table, I don't have this behavior when using ON DUPLICATE KEY UPDATE. Instead, I get the id of the updated row. But now for some reason in a new table I have created, I keep getting the next id that doesn't even exist. Both tables are MyISAM, and have an auto increment field. I don't understand why they behave differently.

Example:

==================================
Table: example
==================================
id  |   unique_field    |   data
==================================
1   |   unique1         |   123
2   |   unique2         |   456

INSERT INTO
    example
SET
    unique_field = 'unique1',
    data = '321'
ON DUPLICATE KEY UPDATE
    data = '321'


// mysqli::insert_id returns 3 (not 1)!!

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逆蝶 2024-12-11 07:35:29

来自 mysql 手册

如果表包含 AUTO_INCRMENT 列和 INSERT ... UPDATE
插入一行,LAST_INSERT_ID()函数返回
自动递增值。如果该语句改为更新一行,
LAST_INSERT_ID() 没有意义。但是,您可以解决这个问题
通过使用 LAST_INSERT_ID(expr)。假设 id 是 AUTO_INCRMENT
柱子。要使 LAST_INSERT_ID() 对更新有意义,请插入行
如下:

在重复键更新时插入表(a、b、c)值(1、2、3)
id=LAST_INSERT_ID(id), c=3;使用时 DELAYED 选项将被忽略
关于重复密钥更新。

希望有帮助。

From the mysql manual:

If a table contains an AUTO_INCREMENT column and INSERT ... UPDATE
inserts a row, the LAST_INSERT_ID() function returns the
AUTO_INCREMENT value. If the statement updates a row instead,
LAST_INSERT_ID() is not meaningful. However, you can work around this
by using LAST_INSERT_ID(expr). Suppose that id is the AUTO_INCREMENT
column. To make LAST_INSERT_ID() meaningful for updates, insert rows
as follows:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE
id=LAST_INSERT_ID(id), c=3; The DELAYED option is ignored when you use
ON DUPLICATE KEY UPDATE.

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文