MySQL UPDATE和SELECT一次通过

Pau*_*ter 18 mysql sql-update

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

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

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

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

  • SELECT params
    FROM tasks
    WHERE guid = %d

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

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

小智 10

试试这样

UPDATE `lastid` SET `idnum` =  (SELECT `id` FROM `history` ORDER BY `id` DESC LIMIT 1);
Run Code Online (Sandbox Code Playgroud)

上面的代码对我有用


Qua*_*noi 6

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

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;
Run Code Online (Sandbox Code Playgroud)

  • 在MySQL中,没有太多差异,比如在Oracle中.无论如何,您无法在单个查询中执行此操作,但该过程是对服务器的一次调用,就像您提出的那样.只需稍加努力就可以将BEGIN和COMMIT放入程序中,但最好还是从应用程序中完成,以防万一. (3认同)

小智 0

我不知道单个调用部分,但你所描述的是一个锁。锁是关系数据库的基本元素。

我不知道锁定一行、读取它,然后在 MySQL 中更新它的具体细节,但是通过阅读一些mysql 锁文档,您可以执行各种基于锁的操作。

postgres 的文档有一个很好的例子,准确地描述了你想要做什么:锁定表、读取表、修改表。