Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我可以获取所有更新行的ID吗?_Mysql - Fatal编程技术网

Mysql 我可以获取所有更新行的ID吗?

Mysql 我可以获取所有更新行的ID吗?,mysql,Mysql,假设我在MySQL中做了一个INSERT/ON复制密钥更新,它更新了一堆行。并且该表有一个自动递增主键 有没有简单的方法让MySQL告诉我它刚刚更新的行的ID 我知道我可以做另一个SELECT查询,查找与INSERT语句使用的约束相同的约束,这并不难编写,但如果MySQL能够为我跟踪ID,它似乎会更有效 我在手册中看到了关于上一个插入ID的诀窍,它适用于有一个插入/更新行的情况,但我想知道您正在更新多行的情况。请检查此链接一次 上面说 如果表格包含自动增量 列并插入。。。更新插入一个 行,最后

假设我在MySQL中做了一个INSERT/ON复制密钥更新,它更新了一堆行。并且该表有一个自动递增主键

有没有简单的方法让MySQL告诉我它刚刚更新的行的ID

我知道我可以做另一个SELECT查询,查找与INSERT语句使用的约束相同的约束,这并不难编写,但如果MySQL能够为我跟踪ID,它似乎会更有效

我在手册中看到了关于上一个插入ID的诀窍,它适用于有一个插入/更新行的情况,但我想知道您正在更新多行的情况。

请检查此链接一次

上面说

如果表格包含自动增量 列并插入。。。更新插入一个 行,最后一个函数的插入ID() 返回自动增量值。如果 该语句将更新一行, 最后一次插入\u ID()没有意义。 但是,您可以通过以下方式解决此问题: 使用最后一个插入ID(expr)。假设 该id是自动增量列

要使
LAST\u INSERT\u ID()
对更新有意义,请按如下方式插入行:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

撇开效率不谈,除非您使用“选择进行更新”(保持行锁定),否则您甚至不能保证后续的选择将拾取与刚更新的行相同的行,因此即使是第二次读取也不是万无一失的。

触发器在MYSQL中效率相当低,但如果确实需要这样做,请在相关表上创建触发器[for update,insert],并让它将修改行的ID插入到另一个表中。您需要存储
connection\u id()
(当前会话的),这样您就可以分隔由另一个会话上的语句插入的行

是的,这就是我在问题的最后一句中提到的。是我弄错了,还是这只适用于单个插入?是我误解了,还是您不是在寻找插入或更新创建/影响的完整ID集?一种类似于ALL_LAST_INSERT_ID()ish的方法?以上是为了确保最后一个插入ID在使用时提供正常的输出,即使有多个插入或更新,它也能正常工作。JustDanyul:是的,我是。但据我所知,最后一个插入ID(即使使用此技巧)只保存一个ID值。你如何从中获得多重价值?据我所知,你没有:)@Ken,抱歉没有看到你的评论;据我所知,通过mysql文档;即使是
LAST\u INSERT\u ID
也会保留最后插入的行ID。不确定是否有可能获得所有插入行的ID。我很确定答案是否定的。您需要放弃扩展插入,并在每次插入/更新每行之前检查约束。Mchl:下面两个答案都提供了创造性的可能解决方法,但正如所问,你的答案看起来是正确的。:-)