当前位置:  开发笔记 > 后端 > 正文

MySQL UPDATE和SELECT一次通过

如何解决《MySQLUPDATE和SELECT一次通过》经验,为你挑选了2个好方法。

我有一个要执行的MySQL任务表,每行都有一个任务的参数.
有许多工作者应用程序(可能在不同的机器上),在循环中执行任务.
应用程序使用MySQL的本机C API访问数据库.

为了拥有一个任务,一个应用程序做了类似的事情:

生成全局唯一ID(为简单起见,假设它是一个数字)

UPDATE tasks
SET guid = %d
WHERE guid = 0 LIMIT 1

SELECT params
FROM tasks
WHERE guid = %d

如果最后一个查询返回一行,我们拥有它并让参数运行

有没有办法在一次调用服务器时实现相同的效果(即'拥有'一行并获取其参数)?



1> 小智..:

试试这样

UPDATE `lastid` SET `idnum` =  (SELECT `id` FROM `history` ORDER BY `id` DESC LIMIT 1);

上面的代码对我有用



2> Quassnoi..:

您可以创建一个执行此操作的过程:

CREATE PROCEDURE prc_get_task (in_guid BINARY(16), OUT out_params VARCHAR(200))
BEGIN

  DECLARE task_id INT;

  SELECT id, out_params
  INTO task_id, out_params
  FROM tasks
  WHERE guid = 0
  LIMIT 1
  FOR UPDATE;

  UPDATE task
  SET guid = in_guid
  WHERE id = task_id;

END;

BEGIN TRANSACTION;

CALL prc_get_task(@guid, @params);

COMMIT;


在MySQL中,没有太多差异,比如在Oracle中.无论如何,您无法在单个查询中执行此操作,但该过程是对服务器的一次调用,就像您提出的那样.只需稍加努力就可以将BEGIN和COMMIT放入程序中,但最好还是从应用程序中完成,以防万一.
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有