Aurora MySQL 列值的批量垂直更新

Bulk Vertical update of Aurora MySQL column values

所以我正在使用 Aurora MYSQL 数据库,我的 AWS Lambda 实例需要执行以下操作。 假设 table 有两列,ID 和 Translated ID。 我可以访问 Lambda 函数,它将 ID 作为输入,并输出翻译后的 ID。它还可以获取 ID 列表,并返回翻译后的 ID 列表。 现在的问题是,我正在按照工作流程逐行执行: 1. 从 table 中获取前 100 行,其中翻译后的 ID 为空, 2. 对于每一行,检索 ID,使用 API 获取翻译后的 ID。 3. 用翻译后的 id 更新行。 4. 冲洗并重复所有 100 行。

问题是由于涉及中间 api 的延迟,逐行操作导致 lambda 函数超时。有什么办法可以进行批量操作,同时仍然将翻译后的 IDS 与相应的 ID 垂直对齐?类似于:

  1. 从 table 获取前 100 个 IDS,其中转换后的 ID 为空。
  2. 使用API获取所有100个ID的列表,得到相应的100个翻译后的ID列表。
  3. Pefro,(最好在一个更新命令中)更新所有 100 个 ID 行,以及它们对应的 Translated-id 列。

4 个查询:

(0)。确保环境干净(如果您从不重用数据库连接,则可以省略此一项)。

DROP TEMPORARY TABLE IF EXISTS my_updates;

(1)。创建一个临时文件 table 来保存新值。

CREATE TEMPORARY TABLE my_updates (
  id INT NOT NULL,
  translated_id INT NOT NULL,
  PRIMARY KEY(id)
);

(2)。在批量插入中插入所有新值。

INSERT INTO my_updates (id, translated_id)
VALUES (?,?), (?,?), (?,?), ...

重复 (?,?) × 100。将包含 200 个元素的数组传递给此查询。一些 MySQL 库具有用于多行插入的快捷方式,其他库则需要构建行参数占位符集。

(3)。您现在在服务器上拥有所有 100 个新元组,因此您可以要求它更新...加入。

UPDATE base_table b
  JOIN my_updates m ON m.id = b.id
   SET b.translated_id = m.translated_id;

您也可以在一个查询中执行此操作,尽管它有点复杂:

UPDATE base_table
   SET translated_id = CASE id
       WHEN @i1 THEN @ti1
       WHEN @i2 THEN @ti2
       ...
       WHEN @i100 THEN @ti100
       ELSE translated_id END
 WHERE id IN (@i1,@i2,...@i100);

我在这里使用@value 作为占位符来解释什么发生了什么,因为它不如上面的例子直观,但这个查询实际上也应该使用 ? 占位符来完成。传递的参数将是一个包含 300 个成员的数组,其中包含 100 组 (id,translated_id),然后是 WHERE 的所有 (id) 值。 ELSE 是一种安全预防措施......实际上永远不会到达它,但如果它是,则不会覆盖任何数据。