在PostgreSQL的交易块中获取一个ID[英] Getting an ID inside a PostgreSQL transaction block

本文是小编为大家收集整理的关于在PostgreSQL的交易块中获取一个ID的处理方法,想解了在PostgreSQL的交易块中获取一个ID的问题怎么解决?在PostgreSQL的交易块中获取一个ID问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试将我所有应该是全有或全无的事务包装到 BEGIN 和 COMMIT 中,但我不确定在以下情况下如何执行此操作.

我有3张表,一张用于图片,一张用于albums,一张用于它们之间的关系,即album_images.该系统的工作方式是用户可以在一次操作中创建一个相册并用他的图像填充它.SQL如下:

BEGIN;
  INSERT INTO albums [...];  -- Create a new album row
  SELECT id AS album_id FROM albums WHERE [...];  -- Get that rows ID
  -- Now use album_id in the next statement
  INSERT INTO album_images (album_id, image_id) [...];
COMMIT;

这可能是一个常见问题,我只是不确定要搜索什么,而且我似乎也无法在文档中找到解决方案.

推荐答案

作为 Cody 提到的 INSERT ... RETURNING 子句的替代方案,您可以使用与 ID 列关联的序列的当前值:

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (currval('albums_id_seq'), image_id) [...];
COMMIT;

当为定义为 serial 的列自动创建序列时,这假定来自 Postgres 的标准命名方案.

另一种选择——如果你只使用一个插入——是使用 lastval() 函数.然后,您甚至不需要将序列名称放入 INSERT 语句中:

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (lastval(), image_id) [...];
COMMIT;

本文地址:https://www.itbaoku.cn/post/1763794.html